2013-06-04 36 views
2

我想包含类似于WordPress中的动作钩子。我已经阅读了关于编写插件的章节,但是我可以在不改变父应用中的代码的情况下维护它们。CakePHP:为插件创建动作钩子

有没有这方面的支持?

如果没有,是否有一个很好的方法来做到这一点?我有一些想法,但我担心我会重新发明轮子。

回答

4

是的。

CakePHP Event System

它的工作原理很多像WordPress的钩子,只有更好。

您可以在不同的地方注册回调,但简单的方法是在插件的bootstrap.php中执行此操作。

当应用程序加载插件时,它可以告诉CakePHP引导它。这是用这个命令完成的。

CakePlugin::loadAll(array(array('bootstrap'=>true,'routes'=>true))); 
+0

我在注册侦听器时遇到了一些麻烦。如果我理解正确,我应该在我的插件的bootstrap.php文件中放置类似于本书示例的代码(http://book.cakephp.org/2.0/en/core-libraries/events.html#registering-listeners),然后然后放置您在父应用程序的bootstrap.php文件中提供的代码。那是对的吗? – emersonthis

+0

是的,如果你的插件没有路由,请删除'routes'。 http://book.cakephp.org/2.0/en/plugins.html – cgTag

+0

感谢您的帮助。在示例代码中,我从最后一行('$ this-> Model-> getEventManager() - > attach()'得到'错误:在不在对象上下文中时使用$ this。这应该如何在插件的bootstrap.php文件中工作? – emersonthis

2

我不知道你想什么acomplish,但你可以做这样的事情:

你的控制器(S)beforeFilter()方法是创建某些码钩子的好去处:

public function beforeFilter() { 
    parent::beforeFilter(); // don't forget to call parent code 
    $myHandler->doSomethingInteresting($this->name, $this->action); 
} 

其中$this->name会给你被调用的控制器的名称,而$this->action会给你当前操作的名称。

我希望它有一点帮助。

+0

确实如此,但是如果你想从一个模型中挂钩应用程序保存数据时。没有人知道该钩子何时会被解雇。您的控制器可能不是当前的活动。 – cgTag

+0

你是对的。我想你的答案更有意义...... – ilbesculpi