# 快速入门(十七):操作绑定到类 如果你的应用规模比较大,每个操作方法彼此相对独立,那么就可以尝试下操作绑定到类的功能。 ## 定义 系统提供了把每个操作方法定位到一个类的功能,可以让你的开发工作更细化,可以设置参数**ACTION_BIND_CLASS**,例如: ~~~ 'ACTION_BIND_CLASS' => True, ~~~ 设置后,我们的控制器定义有所改变,以URL访问为`http://serverName/Home/Index/index`为例,原来的控制器文件定义位置为: ~~~ Application/Home/Controller/IndexController.class.php ~~~ 控制器类的定义如下: ~~~ namespace Home\Controller; use Think\Controller; class IndexController extends Controller{ public function index(){ echo '执行Index控制器的index操作'; } } ~~~ 可以看到,实际上我们调用的是 `Home\Controller\IndexController` 类的**index**方法。 设置操作绑定到类以后,控制器文件位置改为: ~~~ Application/Home/Controller/Index/index.class.php ~~~ 控制器类的定义如下: ~~~ namespace Home\Controller\Index; use Think\Controller; class index extends Controller{ public function run(){ echo '执行Index控制器的index操作'; } } ~~~ 现在,我们调用的其实是 `Home\Controller\Index\index` 类的**run**方法。 > 注意:操作方法类的命名空间比之前要多了一个控制器名称,这个地方很容易忽略。 run方法依旧可以支持传入参数和进行Action参数绑定操作。 ~~~ namespace Home\Controller\Index; use Think\Controller; class index extends Controller{ public function run($name=''){ echo 'Hello,'.$name.'!'; } } ~~~ 我们访问 ~~~ http://serverName/Home/Index/index/name/thinkphp ~~~ 可以看到输出结果为: Hello,thinkphp! ## 前置和后置操作 当设置操作方法绑定到类后,前置和后置操作的定义有所改变,只需要在类里面定义`_before_run`和`_after_run`方法即可,例如: ~~~ namespace Home\Controller\Index; use Think\Controller; class index extends Controller{ public function _before_run(){ echo 'before_'.ACTION_NAME; } public function run(){ echo '执行Index控制器的index操作'; } public function _after_run(){ echo 'after_'.ACTION_NAME; } } ~~~ ## 空控制器 操作方法绑定到类后,一样可以支持空控制器,我们可以创建 `Application/Home/Controller/_empty`目录,即表示如果找不到当前的控制器的话,会到_empty控制器目录下面定位操作方法。 例如,我们访问了URL地址 `http://serverName/Home/Test/index`,但并不存在 `Application/Home/Controller/Test`目录,但是有定义 `Application/Home/Controller/_empty`目录。 并且我们有定义: ~~~ Application/Home/Controller/_empty/index.class.php ~~~ 控制器定义如下: ~~~ namespace Home\Controller\_empty; use Think\Controller; class index extends Controller{ public function run(){ echo '执行'CONTROLLER_NAME.'控制器的'.ACTION_NAME.'操作'; } } ~~~ 访问`http://serverName/Home/Test/index`后 输出结果显示: ~~~ 执行Test控制器的index操作 ~~~ ## 空操作 操作绑定到类后,我们依然可以实现空操作方法,我们只要定义一个 `Home\Controller\Index\_empty`类,就可以支持Index控制器的空操作访问,例如: 控制器定义如下: ~~~ namespace Home\Controller\Index; use Think\Controller; class _empty extends Controller{ public function run(){ echo '执行Index控制器的'.ACTION_NAME.'操作'; } } ~~~ 当我们访问`http://serverName/Home/Index/test`后 输出结果显示: ~~~ 执行Index控制器的test操作 ~~~