13.3 控制器扩展

系统内置的Action基础类完成的功能有限,有时候,我们在项目经常需要扩展一个用于项目的公共Action,又或者我们需要为某些特殊应用增加功能,这些都可以使用控制器扩展来实现。

控制器扩展接口

系统Action类提供了一个初始化方法_initialize接口,可以用于扩展需要,_initialize方法会在所有操作方法调用之前首先执行,用法:
_initialize  控制器初始化方法
用法 _initialize()
参数
返回值
相关方法 可以和getActionName方法配合使用
除了初始化接口外,Action类还提供了两个用于行为扩展的标签位置action_begin和action_end,因此你还可以通过行为扩展来扩展控制器的功能。
控制器扩展只需要继承Action,例如:Class ExtendAction extends Action{
   Public function _initialize(){
   // 初始化的时候检查用户权限
   $this->checkRbac();
}

    // 检查用户权限
  protected function checkRbac() {
    // 这里是具体的检测代码
 }
    // 添加新的上传操作方法
  protected function upload() {
    // 这里是具体的上传实现代码
 }
}
在有些情况下面,控制器扩展并不一定要继承基础的Action。

Hack方法

新版提供了两个hack方法用于对模块和操作方法进行扩展,这些hack函数可以定义到项目的公共函数库里面。
__hack_module  模块hack函数
用法 __hack_module ()
参数
返回值 如果返回一个对象,则会继续执行该对象的对应当前操作的方法。否则,将在执行完__hack_module函数后中止当前操作的执行,但不影响app_end标签的行为执行。
__hack_module仅在访问一个不存在的模块的时候会被调用,优先级大于空模块。简单的说,如果定义了__hack_module 则当前模块不存在的情况下操作会被接管。
下面是一个定义的示例:function __hack_module(){
    if ('Test'== MODULE_NAME){
       $module = New MyAction();
       return $module;
    }
}
__hack_action  操作hack函数
用法 __hack_action ()
参数
返回值
__hack_action函数定义后仅在访问一个不存在的操作方法,而且当前控制器没有定义空操作方法和对应的默认模板文件的时候才会被执行。在__hack_action 函数中获取当前的操作名可以调用常量ACTION_NAME,你可以根据情况自行处理当前的操作。
下面是一个定义的示例:function __hack_action(){
    if ('Test'== ACTION_NAME){
       echo 'Hello,Just Test! You can do anything here…';
    }
}