Существует два «правильных» способа подключения событий к контроллерам.
Во-первых, на заводе-изготовителе контроллера (у вас есть фабрика, правильно ?!), вы можете ввести экземпляр менеджера событий и любых прослушивателей вручную. (Это работает отчасти потому, что если вы сделаете это, инициализатор для EventManagerAwareInterface
будет не-оп, как он обнаружит экземпляр EM уже присутствует.)
function ($controllers) {
$services = $controllers->getServiceLocator();
$controller = new SomeController();
$events = $services->get('EventManager');
// Attaching here at 100; use the priority that makes sense for the listener
$events->attach('dispatch', $services->get('YourListener'), 100);
$controller->setEventManager($events);
return $controller;
}
выше предполагает, что слушатель является оказание услуг; Очевидно, вы могли бы просто создать экземпляр.
Второй путь, и наиболее часто используется, чтобы использовать общий менеджер событий:
$sharedEvents = $events->getSharedManager();
$sharedEvents->attach(<identifier or array of identifiers>, 'dispatch', <listener>, <priority>);
В этом случае, вы должны знать один или несколько «идентификаторы», которые представляют интерес для вас ,Для всех контроллеров, простирающихся один из ZF абстрактных контроллеров, следующие всегда присутствуют:
Zend\Stdlib\DispatchableInterface
Zend\Mvc\Controller\AbstractController
Теперь, в зависимости от типа контроллера, вы будете иметь дополнительные идентификаторы:
- Контроллеры нормального действия также имеют
Zend\Mvc\Controller\AbstractActionController
.
- Контроллеры REST имеют как
AbstractActionController
, так и Zend\Mvc\Controller\AbstractRestfulController
.
- Если вы используете Apigility, ресурсы REST также имеют
ZF\Rest\RestController
.
И, наконец, в дополнение к этим реализация по умолчанию также включает в себя FQCN контроллера в качестве идентификатора.
Что это значит, это обеспечивает вам детализацию привязанности. Если вы присоедините , используя FQCN в качестве идентификатора, слушатель будет только активирован , если этот конкретный контроллер вызывается! Если вы прикрепляете с помощью Zend\Mvc\Controller\AbstractActionController
в качестве идентификатора, то прослушиватель будет запущен для любойAbstractActionController
расширение! (А присоединение к Zend\Stdlib\DispatchableInterface
означает что любых контроллера, который запускает событие отправки вызовет слушатель.)
Вышеупомянутая проблема является серьезной плохой практикой, поскольку она опирается на статическое состояние (трудно проверить, легко компрометировать). Я привел подробное объяснение в другом ответе для более подходящих способов достижения этого. – weierophinney