CakeDC的CakeDC评论插件documentation表示:
组件回调
可以覆盖或扩展最多注释组件 控制器中的方法。为此,我们需要创建方法 前缀callback_comments示例:
callback_add将在控制器中命名为callback_commentsAdd, callback_fetchData将命名为callback_commentsFetchData 控制器。 ...
它完美地在控制器上运行!:
public function callback_commentsInitType(){
return 'flat'; // threaded, tree and flat supported }
我想知道cakephp-2.0允许你这样做的新功能是什么?我需要了解如何能够在未来的组件上实现这种方法。
答案 0 :(得分:2)
在组件的代码中,如果查看this文件中的以下函数(从第622行开始):
/**
* Call action from commponent or overriden action from controller.
*
* @param string $method
* @param array $args
* @return mixed
*/
protected function _call($method, $args = array()) {
$methodName = 'callback_comments' . Inflector::camelize(Inflector::underscore($method));
$localMethodName = 'callback_' . $method;
if (method_exists($this->Controller, $methodName)) {
return call_user_func_array(array(&$this->Controller, $methodName), $args);
} elseif (method_exists($this, $localMethodName)) {
return call_user_func_array(array(&$this, $localMethodName), $args);
} else {
throw new BadMethodCallException();
}
}
您可以看到正在使用前缀$methodName
定义变量callback_comments
,然后在$method
处理之后将Inflector::underscore
附加到其中,然后{ {1}}方法。这些工作如下:
Inflector::camelize
会将Inflector::underscore
转换为initType
。检查文档here。init_type
会进一步将Inflector::camelize
转换为init_type
。检查文档here。现在,如果在参数中传递InitType
,那么initType
将是:
$methodName
+ callback_comments
= InitType
此后,还会生成callback_commentsInitType
。在我们的$localMethodName
示例中,它将是:
initType
+ callback_
= initType
在生成名称之后,它将简单地搜索附加控制器中是否存在该方法,并使用callback_initType
函数执行它,方法是将其传递给对象(在我们的例子中是控制器对象) call_user_func_array
)或组件对象本身(&$this->Controller
))包含方法,&$this
作为第一个参数,然后$methodName
作为第二个参数。
如果在控制器中找不到该功能,则它将使用$args
搜索组件。如果找到了,那么它将以相同的方式执行。
现在所有这些工作原理是$localMethodName
函数是用于调用组件的所有内部函数的单个函数,因此它将首先检查函数是否已在控制器中被覆盖,否则它将在组件本身中执行该功能。
您可以检查组件的beforeRender函数here,然后您将看到如何调用_call
函数。在这种情况下,如果控制器包含名为initType
的函数,那么它将被执行。否则,将执行组件callback_commentsInitType
。
希望这会有所帮助..