Afinogen
@Afinogen
PHP разработчик

Как использовать события в ZF2/3?

Доброго времени суток!
Подскажите пожалуйста, как правильно подписываться на события и в каком месте. В интернете кучу примеров с 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) {
Что не красиво и не удобно. Как правильно делать? Где можно посмотреть?
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
@novrm
Вам нужно понять главный смысл событий в ZF3 - нужно создавать ОТДЕЛЬНЫЙ ИНДИВИДУАЛЬНЫЙ экземпляр EventManager для каждой группы событий.
... и потом извлекать события из этого же ИНДИВИДУАЛЬНОГО EventManager*а.
То есть фишка с одним EventManager для ВСЕГО проекта - это путь в тупик.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Fortop
Tech/Team lead
Во-первых, задача событий как раз уход в луну.
На событиях вы реализуете или расширение основного функционала или работу необязательных для основного потока вещей.

Это снимет массу головной боли и сейчас при отладке и в будущем.

Во-вторых, подписываться на события правильно на этапе инициализации приложения.
Это может быть бутстрап приложения, бутстрап модуля, в момент инициализации конкретного сервиса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы