Содержание


The Module Manager


The Module Manager, ZF2, Zend Framework 2, ЗФ2




Менеджер модулей, Zend\ModuleManager\ModuleManager - это  простой класс, отвечающий за итерацию по массиву имен модулей и запуск последовательностей событий для каждого из них.

 


События (Events) Module Manager

 

1) loadModules

Это событие  предназначено в первую очередь для внутреннего использования. Помогает инкапсулировать загрузку модулей в слушателях, а также позволяет событию loadModules.post быть более дружественным. Внутренние слушатели могут могут быть прикреплены к этому событию с отрицательным приоритетом вместо loadModules.post, что бы разработчик был уверен в срабатывании нужного события сразу после выполнения loadModules.post.

2) loadModule.resolve

Срабатывает для каждого модуля, который должен быть загружен. Слушатели этого события ответственны за получение имени модуля и создания экземпляра нужного класса. По-умолчанию  в ZF2 ищется класс {modulename}Module, создает его экземпляр и возвращает, если такой класс находится.

 

Имя модуля может быть получено слушателями, которые используют метод объекта Event  getModuleName(). Слушатель должен принять это имя и передать его в экземпляр объекта, отвечающего за данный модуль. Множественные слушатели  так же могут быть присоединены к этом событию и менеджер модулей вызовет их в соответствие их приоритетам. Это позволяет Вам подключить дополнительные слушатели, которые имеют альтернативные методы для разрешения (resolving) модуля в зависимости от полученного имени.

3) loadModule

Как только главный слушатель передал имя модуля в объект, менеджер модулей сразу вызывает событие, которое передает созданный объект всем слушателям.

4) loadModules.post

Это событие позволяет выполниться любому нужному событию сразу после загрузки модуля. На пример, слушатель конфигурации по умолчанию, Zend\ModuleManager\Listener\ConfigListener, прикрепленный к этому событию, позволяет объединить дополнительные пользовательские конфигурации, которые предназначены для переопределения стандартных конфигураций установленных модулей.

 


Слушатели (Listeners) Module Manager

 

По умолчанию Zend Framework 2 предоставляет несколько полезных слушателей.

 

1) Zend\ModuleManager\Listener\DefaultListenerAggregate

Для упрощения использования наиболее распространенных вариантов работы с менеджером модулей в ZF2 есть специальный слушатель. В большинстве случаев Вам будет достаточно только этого слушателя для использования module manager.  Он позаботится о правильной установке необходимых (описаны ниже) слушателей для модульной системы и их правильном функционировании.

2) Zend\ModuleManager\Listener\AutoloaderListener

Проверяет все модули и ищет реализацию Zend\ModuleManager\Feature\AutoloaderProviderInterface илипростоопределяютметод  getAutoloaderConfig().  Если такой находится, то вызывается метод класса модуля getAutoloaderConfig() и возвращает массив Zend\Loader\AutoloaderFactory.

3) Zend\ModuleManager\ListenerConfigListener

Если в классе модуля имеется метод getConfig() или реализация Zend\ModuleManager\Feature\ConfigProviderInterface, то этот слушаетль вызовет его и вернет массив (или Traversable object) в главную конфигурацию приложения.

4) Zend\ModuleManager\Listener\InitTrigger

Если в классе модуля есть реализация интерфейса Zend\ModuleManager\Feature\InitProviderInterface, или просто метод init(), то этот слушаетль вызовет этот метод и передаст текущий экземпляр Zend\ModuleManager\ModuleManager в качестве единственного параметра.

Подобно OnBootstrapListener, init() метод вызывается для каждого модуля, реализующего этот метод, на каждой странице запроса и должен использоваться исключительно для «легких» задач, таких как регистрация слушателей событий или подобных.

5) Zend\ModuleManager\Listener\LocatorRegistrationListener

Если в классе модуля есть реализация интерфейса Zend\ModuleManager\Feature\LocatorRegisteredInterface, то слушатель будет инъекцировать экземпляр класса модуля в ServiceManager, используя имя класса модуля как имя сервиса. Этопозволитпотомпринеобходимостиизвелечьмодульклассаиз ServiceManager.

6) Zend\ModuleManager\Listener\ModuleResolverListener

Это распознаватель модуля по-умолчанию. Прикрепляется к «loadModule.resolve» и возвращает экземпляр {moduleName}Module.

7) Zend\ModuleManager\Listener\OnBootstrapListener

Если в классе модуля есть реализация интерфейса Zend\ModuleManager\Feature\BootstrapListenerInterface, или просто метод onBootstrap (), то слушатель зарегистрирует метод onBootstrap () с Zend\Mvc\Application bootstrap событием. Этот метод потом будет вызываться при срабатывании события начальной загрузки ( как MvcEvent).

Подобно InitTrigger, метод onBootstrap() вызывается для каждого модуля  реализующего его, на каждой странице запроса и должен испоьзоваться исключительно для «легкий» действий. Например регистрации слушателей.

8) Zend\ModuleManagerListener\ServiceListener

Если в классе модуля есть реализация интерфейса Zend\ModuleManager\Feature\ServiceProviderInterface, или просто метод getServiceConfig (), то слушатель вызовет этот метод и агрегирует(оюъединит) полученые знаечения для использования в конфигурации ServiceManager.

Метод getServiceConfig() может возвращать массив конфигурации совместимый с Zend\ServiceManager\Config, экземпляр этого класса, или строку с именем класса, расширяющего его. Эти значения будут обработаны и потом смогут быть объединены с любой конфигурацией ConfigListener, подпадающих под service_manager ключ. Более подробно в разделе ServiceManager.

В отличие от других слушателей, этот слушатель не управляется DefaultListenerAggregate, вместо этого создается и инициализируется Zend\Mvc\Service\ModuleManagerFactory, где он инъецируется с текущим экземпляром ServiceManager, перд тем как будет зарегистрирован в событии ModuleManager.

 

Кроме того, этот слушатель управляет различными плагинами менеджеров, включая помощники видов (view helpers), контроллерами и плагинами контроллеров. В любом слчае у Вас есть возможность гибко указывать конфигурацию для определения плагинов или предоставить конфигурацию через  класс Module. Конфигурация имеет такой же формат, как и для ServiceManager.. В таблице ниже приведены плагины менеджеров, которые можно сконфигурировать подобным образом (в том числе ServiceManager), ключи конфигурации, интерфейсы ModuleManager (все интерфейсы расположены в Zend\ModuleManager\Feature namespace)  и  названия методов.

 

Plugin Manager:

ZendServiceManagerServiceManager

ZendViewHelperPluginManager

ZendMvcControllerControllerManager

ZendMvcControllerPluginManager

 

Config Key:

service_manager

view_helpers  

controllers      

controller_plugins      

 

Interface:

ServiceProviderInterface

ViewHelperProviderInterface

ControllerProviderInterface

ControllerPluginProviderInterface

 

Module Method:

getServiceConfig

getViewHelperConfig

getControllerConfig

getControllerPluginConfig

 

Конфигурации взяты из примеров в ServiceManagerconfiguration. Для «configuration keys» допускаются следующие значения:

Config Key                                                               Allowed values

1) services - пары имя службы / экземпляр (name/instance pairs) (должны быть  определены только в класс  модуля Module)

2) invokables– пары имя службы / имя класса (servicename/classname) класса, которые могут быть вызваны без аргументов конструктора.

3) factories - службы имен, указывающих на фабрики. Фабрикой может быть любой PHP класс или класс, реализующий интерфейс Zend\ServiceManager\FactoryInterface, или класс реализующий метод __invoke.

4) abstract_factories– массив либо сущбность  Zend\ServiceManager\AbstractFactoryInterface, или имен классов, реализующих этот интерфейс. Если используется сущность, то она должна быть определена только в классе Module.

5) initializers – массив, строка с именем класса, реализующего интерфейс ZendServiceManagerInitializerInterface.

 

При работе с плагином менеджеров, Вы должны будете передать экземпляр плагина менеджеров в factories, abstract factories, или initializers. Если есть необходимость в доступе к службам приложений (application services), Вы можете использовать метод getServiceLocator(), как в следующем примере:

public function getViewHelperConfig()
{
    return array('factories' => array(
        'foo' => function ($helpers) {
            $services = $helpers->getServiceLocator();
            $someService = $services->get('SomeService');
            $helper = new HelperFoo($someService);
            return $helper;
        },
    ));
}

Это мощная техника, позволяющая вашим плагинам быть отделйными и независимыми от инъекций, а так же использовать принципы  инверсии управления (Inversion of Control principals) с плагинами. 


Автор статьи: DuB