控制器[1]

一. 控制器操作

我们首先复习一下基本的控制器定义和方法执行方式。
第一步:控制器默认创建在当前模块下的 Controller 目录下;
第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php;
第三步:控制器里的方法必须是 public 公共的;

1 //控制器
2 class UserController s extends Controller {
3 public n function index() {
4 //index()方法在URL访问时可以忽略
5   }
6 }
 URL 访问: http://localhost/demo39/User/index/ 

有时方法名可能和关键字冲突,那么定义起来就比较麻烦

在 WeiBo/home/controller/IndexController.class.php 中如果方法名与ThinkPHP中的关键字重合,则会出错,类似:

1 <?php
2 namespace Home\Controller;
3 use Think\Controller;
4 class IndexController extends Controller {
5     public function class() {
6         echo "this is class";
7     }
8 }

报错如下:

控制器提供了一个配置定义:

在 WeiBo/Conf/config.php 中进行配置:

1 //配置控制器方法后缀
2 'ACTION_SUFFIX'=>'Action',

每个方法后面加上Action,对于URL访问不需要加Action

1 class IndexController  extends Controller {
2  public  function indexAction() {
3   echo 'index';
4 }
5  public function classAction() {
6  echo 'test';
7   }
8 }

这是在浏览器中输入 http://localhost/demo39/index/class 则可以访问,

注意,这是浏览器中的地址还是class,而不是classAction

 

默认情况下通过 URL 访问的页面是控制器模块下的方法,即:Controller 目录下的
UserController.class.php 类。它是对外公开可访问的,我们可以称为访问控制器。那
么很多时候,由于项目业务的高度繁杂,我们可能想法很多业务分离到另外的层,比如事件
控制器层。那么可以这么操作:

第一步:创建事件控制器目录:Event;(此时Event与Controller同级)
第二步:创建 UserEvent.class.php 类;

代码如下:

1 <?php
2 namespace Home\Event;
3 
4 class UserEvent {
5     public function test() {
6         echo '这是事件控制器层的封装,不对外公开,属于内部调用!';
7     }
8 }

在 WeiBo/home/controller/IndexController.class.php 中调用是如下:

<?php

namespace Home\Controller;
use Think\Controller;
use Home\Event\UserEvent;

class indexController extends Controller {

    public   function event() {
       $userEvent =  new UserEvent();
       $userEvent->test();
         echo 'test';
   }
}

这时即可调用成功:

PS:这里调用别的控制器还可以使用快捷调用方法 A()。

1 $userEvent = A('User', 'Event');
2 $userEvent = A('Admin/User', 'Event'); //在Admin下的user调用Event

代码如下:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 use Home\Event\UserEvent;
 6 
 7 class IndexController extends Controller {
 8     public function event() {
 9         //$userEvent = new UserEvent();
10         $userEvent = A('User','Event');
11         $userEvent->test();
12         echo "test";
13     }
14 }

 

默认情况下,控制器只支持一级控制器。当项目较为繁杂的时候,想创建统一模块下多
个控制器时,可以配置二级控制器。

第一步:配置允许二级控制器

在 WeiBo/Common/Conf/config.php 中写入如下配置代码:

1 //允许二级控制器
2 'CONTROLLER_LEVEL'=>2,

在 WeiBo/Home/Controller/ 下新建  Member  文件夹,然后在 Member 文件夹下新建 CommentController.class.php 文件,代码如下:

1 <?php
2 namespace Home\Controller\Member;
3 use Think\Controller;
4 
5 class CommentController extends Controller {
6     public function test() {
7         echo 'comment test';
8     }
9 }

此时在浏览次地址出输入 http://localhost/demo39/Member/Comment/test 即可得到:

但是此时如果加载与 Member 文件同级的 IndexController.class.php ,则会发生错误,

但如果在config文件中把

1 //允许二级控制器
2 'CONTROLLER_LEVEL'=>2,

去掉,则又可以重新访问了。

 

ThinkPHP 控制器还提供了两个特殊的方法,前置操作方法_before_index()和后置操
作方法_after_index()。这两个方法,在控制器调用 index()方法的时候,一个在之前执

行,一个在之后执行。

在 WeiBo/Home/Controller/IndexController.class.php 中的代码如下:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 use Home\Event\UserEvent;
 6 
 7 class IndexController extends Controller {
 8     public function index() {        
 9         echo "this is index"."<br>";
10     }
11 
12     public function _before_index() {
13         echo "this is before index"."<br>";
14     }
15     public function _after_index() {
16         echo "this is after index"."<br>";
17     }
18 }

效果图如下:

 

二.Action  参数绑定

参数绑定是通过直接绑定 URL 地址中的变量作为操作方法的参数,可以简化方法的定
义甚至路由的解析。

在 WeiBo/Common/Conf/config.php 中配置如下:

1 //启用Action参数绑定,默认为true,可以不写
2 'URL_PARAMS_BIND'=> true,

默认的参数绑定是按变量名来绑定的,直接通过 URL 传递参数。

1 //变量名为$id
2  class IndexController  extends Controller {
3  public  function index($id) {
4  echo 'id:'.$id;
5      }
6 }

 

通过URL  http://localhost/demo39/Index/index/id/5 访问,得到:

PS:当你 URL 没有传递参数(id/5)的时候,那么页面会报错:参数错误或者未定义:id。
当然,如果取消绑定,则不会报错'URL_PARAMS_BIND'=> false,。但是,为了程序的
严谨性,一般需要不要取消参数绑定。

 

如果你个那个参数设定一个默认值,当没有传递参数的时候,会直接启用默认值:

1 //给变量$id 设置默认值
2  public  function index($id=1)

还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说 id 不需要
传递,只需要传递 5 这个值即可。但必须按照多个参数的顺序。

在config.php中的配置如下:

1 //定义按顺序传参绑定
2 'URL_PARAMS_BIND_TYPE'=>1,

在 WeiBo/Home/Controller/IndexController.class.php 中的代码如下:

//传递两个参数
 class IndexController  extends Controller {
 public  function index($id, $type) {
 echo 'id:'.$id.',type:'.$type;
  }
}

此时URL  http://localhost/demo39/User/index/5/a 

得到结果如下:

posted @ 2015-06-14 16:31  todaytoday  阅读(212)  评论(0编辑  收藏  举报