john.brown
просто кулибин
Реализация обработки событий
Доброго времени суток.
Вот есть какая не то система, в ней модули, сушности, всякое такое. Ну и вобщем удобно массу вещей делать по событиям - удаляем какую то сушность и по beforeDelete удаляем связанные сушности, а по afterDelete пишем стат, что удалили... Вобшем, кучу полезных вещей можно делать. Вопрос об реализации обработки событий. Мне представляется два варианта:
1) какая то сушность генерит событие ( $this->api->events->fire($event)), некий центральный эвент манагер извлекает данные об прикрепленных слушателях, и, соответственно, вызывает их.
Так оно у меня счас реализовано, все вроде просто и логично. Токмо вот гемморой с отслеживанием регистрации слушателей - при установке/удалении каких не то частей приложения...
2) эвент манагер просто просматривает эвент хэндлеры всех модулей, на предмет подходящего ообработчика, и вызывает его. А обработчик уже сам решает, обрабатывать, или пропустить. Как то так:
Польза очевидна в том, что никакого отслеживания регистра слушателей, типа, все организуется само собой. Вот токмо вопрос, не очень ли ресурсоемком будет такое неограниченное распространение событий через все приложение?
Вобщем, хотел бы слышать какие не то мысли по этому поводу.
Доброго времени суток.
Вот есть какая не то система, в ней модули, сушности, всякое такое. Ну и вобщем удобно массу вещей делать по событиям - удаляем какую то сушность и по beforeDelete удаляем связанные сушности, а по afterDelete пишем стат, что удалили... Вобшем, кучу полезных вещей можно делать. Вопрос об реализации обработки событий. Мне представляется два варианта:
1) какая то сушность генерит событие ( $this->api->events->fire($event)), некий центральный эвент манагер извлекает данные об прикрепленных слушателях, и, соответственно, вызывает их.
PHP:
class core_event_Manager extends core_BaseClass {
...
public function fire($event) {
$sender = $event->getSender();
$eventType = $event->getType();
$listeners = $this->api->registry->get('Events/'.$eventType.'/'.$sender);
if(!$listeners) return;
foreach($listeners as $listener) {
if(is_callable(array($listener, $eventType))) {
call_user_func(array($listener, $eventType), $event);
}
}
}
}
2) эвент манагер просто просматривает эвент хэндлеры всех модулей, на предмет подходящего ообработчика, и вызывает его. А обработчик уже сам решает, обрабатывать, или пропустить. Как то так:
PHP:
class core_event_Manager extends core_BaseClass {
...
public function fire($event) {
$eventType = $event->getType();
foreach($this->eventHandlers as $handler) {
if(is_callable($handler, $eventType)) {
call_user_func(array($handler, $eventType), $event);
}
}
}
}
class some_module_EventHandler {
...
public function onBeforeDelete($event) {
$sender = $event->getSender();
switch($sender) {
case 'some_ClassName':
// делаем что-то
break;
default:
// не делаем ничего
}
}
}
Вобщем, хотел бы слышать какие не то мысли по этому поводу.