В этом разделе мы дадим продвинутую информацию о менеджере событий (event manager). Вы можете спокойно пропустить этот раздел, однако прочитайте его, если планируете создавать сложные обработчики событий.
Ранее в этой главе мы упомянули, что жизненный цикл приложения состоит из событий (events).
Один класс может вызвать (trigger) событие, а другие классы могут обработать (listen) событие. Технически, вызов события означает просто напросто
вызов "callback" метода другого класса. Менеджер событий реализован внутри компонента Zend\EventManager
.
Важно знать меру в использовании событий. Например, ZF3 (и в частности его компонент
Zend\Mvc
) сильно зависит от событий в своей работе, и по этой причине его исходный код - это "довольно сложная для понимания" комбинация обработчиков событий. К счастью, в большинстве случаев вам не нужно понимать как ZF3 вызывает события и реагирует на них внутри своего кода, вам только нужно знать что такое событие, какие события есть в жизненном цикле приложения и в чем разница между обычным менеджером событий и общим менеджером событий (shared event manager).
Событие (event) - это технически экземпляр класса Zend\EventManager\Event
.
Событие может иметь как минимум следующие части:
Также возможно создавать производные типы событий, расширяя класс Event
.
Например, компонент Zend\Mvc
определяет производный класс события Zend\Mvc\MvcEvent
,
который наследуется от класса Event
и добавляет некоторые свойства и методы, которые нужны
для работы компонента Zend\Mvc
.
Важно понимать разницу между обычным менеджером событий и общим (shared) менеджером событий.
Обычный менеджер событий не хранится в единственном экзепляре в менеджере сервисов. Каждый раз как вы извлекаете сервис EventManager
из менеджера сервисов, вы получаете новый экземпляр. На самом деле это делается для двух целей (приватность событий и производительность):
Подразумевается по умолчанию, что класс, использующий менеджер событий для вызова событий будет использовать свой собственный экземпляр менеджера событий, поскольку он не хочет, чтобы другие классы автоматически могли слушать эти события. События, вызываемые классом, принадлежат приватно этому классу.
Если все будут подписываться на события от всех классов, будет ад производительности - слишком много обработчиков событий будут вызываться, увеличивая время загрузки страницы. Лучше избегать этого, оставив события по умолчанию приватными.
Но, в случае если кому-нибудь нужно намеренно подписаться на события всех или только некоторых классов, есть специальный общий (shared) менеджер событий. Сервис SharedEventManager
хранится в менеджере сервисов как синглтон, так что вы можете быть уверены, что все будут иметь только один его экземпляр.
С SharedEventManager
ом, вы можете прикрепить обработчик событий к приватным событиям, вызываемым конкретным классом (или некоторыми классами).
Вы указываете уникальные идентификаторы классов, от которых вы хотите слушать события. Вот так просто!
Некоторые примеры того, как вы можете слушать и реагировать на события, можно найти в главах Создание нового модуля и Управление пользователями и аутентификация.