Я пытаюсь использовать систему событий в 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 event manager
$statistics = new UserStatistic();
$this->Order->getEventManager()->attach($statistics);
Но он не говорит, где должен находиться этот код. Внутри конкретного контроллера? Внутри контроллера приложения?
В случае, если это имеет значение, слушатель будет частью плагина, который я пишу.
Update: Это звучит как популярный способ сделать это, поместив регистрационный код слушателя в файл 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()
в одну строку.