ThinkPHP3.2.3操作绑定到类


如果你的应用规模比较大,每个操作方法彼此相对独立,那么就可以尝试下操作绑定到类的功能。

定义

系统提供了把每个操作方法定位到一个类的功能,可以让你的开发工作更细化,可以设置参数ACTION_BIND_CLASS,例如:

  1. 'ACTION_BIND_CLASS'    =>    True,

设置后,我们的控制器定义有所改变,以URL访问为http://serverName/Home/Index/index为例,原来的控制器文件定义位置为:

  1. Application/Home/Controller/IndexController.class.php

控制器类的定义如下:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller{
  4.     public function index(){
  5.         echo '执行Index控制器的index操作';
  6.     }
  7. }

可以看到,实际上我们调用的是 Home\Controller\IndexController 类的index方法。

设置操作绑定到类以后,控制器文件位置改为:

  1. Application/Home/Controller/Index/index.class.php

控制器类的定义如下:

  1. namespace Home\Controller\Index;
  2. use Think\Controller;
  3. class index extends Controller{
  4.     public function run(){
  5.         echo '执行Index控制器的index操作';
  6.     }
  7. }

现在,我们调用的其实是 Home\Controller\Index\index 类的run方法。

注意:操作方法类的命名空间比之前要多了一个控制器名称,这个地方很容易忽略。

run方法依旧可以支持传入参数和进行Action参数绑定操作。

  1. namespace Home\Controller\Index;
  2. use Think\Controller;
  3. class index extends Controller{
  4.     public function run($name=''){
  5.         echo 'Hello,'.$name.'!';
  6.     }
  7. }

我们访问

  1. http://serverName/Home/Index/index/name/thinkphp

可以看到输出结果为:
Hello,thinkphp!

前置和后置操作

当设置操作方法绑定到类后,前置和后置操作的定义有所改变,只需要在类里面定义_before_run_after_run方法即可,例如:

  1. namespace Home\Controller\Index;
  2. use Think\Controller;
  3. class index extends Controller{
  4.     public function _before_run(){
  5.         echo 'before_'.ACTION_NAME;
  6.     }
  7.  
  8.     public function run(){
  9.         echo '执行Index控制器的index操作';
  10.     }
  11.  
  12.     public function _after_run(){
  13.         echo 'after_'.ACTION_NAME;
  14.     }
  15. }

空控制器

操作方法绑定到类后,一样可以支持空控制器,我们可以创建 Application/Home/Controller/_empty目录,即表示如果找不到当前的控制器的话,会到_empty控制器目录下面定位操作方法。

例如,我们访问了URL地址 http://serverName/Home/Test/index,但并不存在 Application/Home/Controller/Test目录,但是有定义 Application/Home/Controller/_empty目录。

并且我们有定义:

  1. Application/Home/Controller/_empty/index.class.php

控制器定义如下:

  1. namespace Home\Controller\_empty;
  2. use Think\Controller;
  3. class index extends Controller{
  4.     public function run(){
  5.         echo '执行'CONTROLLER_NAME.'控制器的'.ACTION_NAME.'操作';
  6.     }
  7. }

访问http://serverName/Home/Test/index后 输出结果显示:

  1. 执行Test控制器的index操作

空操作

操作绑定到类后,我们依然可以实现空操作方法,我们只要定义一个 Home\Controller\Index\_empty类,就可以支持Index控制器的空操作访问,例如: 控制器定义如下:

  1. namespace Home\Controller\Index;
  2. use Think\Controller;
  3. class _empty extends Controller{
  4.     public function run(){
  5.         echo '执行Index控制器的'.ACTION_NAME.'操作';
  6.     }
  7. }

当我们访问http://serverName/Home/Index/test后 输出结果显示:

  1. 执行Index控制器的test操作