控制器[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
得到结果如下: