Доброго времени суток!
Подскажите пожалуйста, как правильно подписываться на события и в каком месте. В интернете кучу примеров с Foo bar, но они не дают ни какого понятия как это использовать в реальных проектах.
Например, у меня есть изменение заказа. В бустрапе модуля сделал так
$sharedEventManager->attach(
Mapper\Order::class,
AbstractMapper::EVENT_INSERT_ENTITY,
function ($e) use ($serviceManager) {
/** @var \Office\Service\Order $orderService */
$orderService = $serviceManager->get(Service\Order::class);
$entity = $e->getParam('entity');
if ($entity) {
$orderService->addOrderLog($entity, Entity\Order\LogAction::CREATED);
}
}
);
Вроде все ок, работает. Событие возникает только в маппере заказа. В таком случаем может надо использовать обычные менеджер событий?
Далее, в сервисе возникает куча событий на создание/изменение/доставку и т.д. заказа. Почитал мануал, надо делать агрегатор событий для подписки кучей.
Сделал. Подписка происходит так.
/**
* @param EventManagerInterface $events
*/
public function attach(EventManagerInterface $events)
{
$this->listeners[] = $events->attach(
Order::EVENT_ERROR_CONFIRM_ORDER, [
$this,
'sendErrorConfirmOrder'
]
);
$this->listeners[] = $events->attach(
Order::EVENT_CONFIRM_ORDER, [
$this,
'okConfirmOrder'
]
);
}
Но как делать установку агрегатора? Если событие возникает в нескольких контроллерах, то нужно в их фабриках прописать что-то такое
$class->getEventManager()->attach($agregator);
Не совсем гибко, забыл добавить установку - события в луну ушли. А мне нужно их между модулями перекидывать.
Попробовал опять SharedEventManager, но тогда в бустрапе получается огромное полотно кода с function ($e) use ($serviceManager) {
Что не красиво и не удобно. Как правильно делать? Где можно посмотреть?