我正在尝试在 CakePHP v2.1+ 中使用事件系统
它似乎非常强大,但文档有些模糊。触发事件似乎很简单,但我不确定如何注册相应的侦听器来侦听事件。相关部分在这里,它提供了以下示例代码:
App::uses('CakeEventListener', 'Event');
class UserStatistic implements CakeEventListener {
public function implementedEvents() {
return array(
'Model.Order.afterPlace' => 'updateBuyStatistic',
);
}
public function updateBuyStatistic($event) {
// Code to update statistics
}
}
// Attach the UserStatistic object to the Order's event manager
$statistics = new UserStatistic();
$this->Order->getEventManager()->attach($statistics);
但它没有说明这段代码应该放在哪里。在特定控制器内部?在应用程序控制器内部?
如果它是相关的,监听器将成为我正在编写的插件的一部分。
更新: 听起来很流行的方法是将侦听器注册代码放在插件的 bootstrap.php 文件中。但是,我不知道如何从那里调用 getEventManager(),因为应用程序的控制器类等不可用。
更新 2: 我还被告知听众可以住在模型中。
更新 3: 终于有了一些牵引力!以下代码将在 MyPlugin/Config/bootstrap.php 中成功记录事件
App::uses('CakeEventManager', 'Event');
App::uses('CakeEventListener', 'Event');
class LegacyWsatListener implements CakeEventListener {
public function implementedEvents() {
return array(
'Controller.Attempt.complete' => 'handleLegacyWsat',
);
}
public static function handleLegacyWsat($event) { //method must be static if used by global EventManager
// Code to update statistics
error_log('event from bootstrap');
}
}
CakeEventManager::instance()->attach(array('LegacyWsatListener', 'handleLegacyWsat'), 'Controller.Attempt.complete');
App::uses()
我不知道为什么,但是当我尝试将两者组合成一行时我不会出错。