A free and open-source book on ZF3 for beginners


3.12. О менеджере событий

В этом разделе мы дадим продвинутую информацию о менеджере событий (event manager). Вы можете спокойно пропустить этот раздел, однако прочитайте его, если планируете создавать сложные обработчики событий.

Ранее в этой главе мы упомянули, что жизненный цикл приложения состоит из событий (events). Один класс может вызвать (trigger) событие, а другие классы могут обработать (listen) событие. Технически, вызов события означает просто напросто вызов "callback" метода другого класса. Менеджер событий реализован внутри компонента Zend\EventManager.

Важно знать меру в использовании событий. Например, ZF3 (и в частности его компонент Zend\Mvc) сильно зависит от событий в своей работе, и по этой причине его исходный код - это "довольно сложная для понимания" комбинация обработчиков событий. К счастью, в большинстве случаев вам не нужно понимать как ZF3 вызывает события и реагирует на них внутри своего кода, вам только нужно знать что такое событие, какие события есть в жизненном цикле приложения и в чем разница между обычным менеджером событий и общим менеджером событий (shared event manager).

3.12.1. Event и MvcEvent

Событие (event) - это технически экземпляр класса Zend\EventManager\Event. Событие может иметь как минимум следующие части:

Также возможно создавать производные типы событий, расширяя класс Event. Например, компонент Zend\Mvc определяет производный класс события Zend\Mvc\MvcEvent, который наследуется от класса Event и добавляет некоторые свойства и методы, которые нужны для работы компонента Zend\Mvc.

3.12.2. EventManager и SharedEventManager

Важно понимать разницу между обычным менеджером событий и общим (shared) менеджером событий.

Обычный менеджер событий не хранится в единственном экзепляре в менеджере сервисов. Каждый раз как вы извлекаете сервис EventManager из менеджера сервисов, вы получаете новый экземпляр. На самом деле это делается для двух целей (приватность событий и производительность):

Но, в случае если кому-нибудь нужно намеренно подписаться на события всех или только некоторых классов, есть специальный общий (shared) менеджер событий. Сервис SharedEventManager хранится в менеджере сервисов как синглтон, так что вы можете быть уверены, что все будут иметь только один его экземпляр.

С SharedEventManagerом, вы можете прикрепить обработчик событий к приватным событиям, вызываемым конкретным классом (или некоторыми классами). Вы указываете уникальные идентификаторы классов, от которых вы хотите слушать события. Вот так просто!

Некоторые примеры того, как вы можете слушать и реагировать на события, можно найти в главах Создание нового модуля и Управление пользователями и аутентификация.


Top