- PVSM.RU - https://www.pvsm.ru -
Это просто фреймворк, или этот фреймворк олицетворяет собой гордость PHP-сообщества — его трудолюбивых разработчиков, так сказать, ключевой ингредиент? С россыпью конфигов… Предмет любви нашего ЯП, обладающий хорошим MVC, благодаря чему Zend Framework — самый лучший фреймворк на PHP.
Здесь вы не найдёте ответа на этот вопрос, зато узнаете про ServiceManager и ModuleManager.
Источник [1], немного [моё].
application.config.php
в секции modules
module.config.php
в секции service_manager
.ZendServiceManagerAbstractFactoryInterface
или ZendServiceManagerServiceManager
). дока [2]Источник [3]
Когда создается ZendMvcApplication
, объект ZendServiceManagerServiceManager
создается и настраивается через ZendMvcServiceServiceManagerConfig
. ServiceManagerConfig
получает конфигурацию из config/application.config.php
(или какой-либо другой конфиг приложения, который передаётся в Application
при его создании). Из всех сервисов и фабрик, представленных в пространстве имен ZendMvcService
, ServiceManagerConfig
является ответственным только за три: SharedEventManager
, EventManager
и ModuleManager
.
После этого Application
извлекает ModuleManager
. В этот момент ModuleManager
через ServiceManager
конфигурирует сервисы и фабрики, предоставляемые в ZendMvcServiceServiceListenerFactory
. Такой подход позволяет максимально упростить конфигурацию основного приложения и предоставить разработчику возможность конфигурировать различные части системы MVC из модулей, переопределяя любую конфигурацию по умолчанию в сервисах этих MVC.
ModuleManager
, выражен в ZendMvcServiceModuleManagerFactory
. Это, пожалуй, самая сложная фабрика в стеке MVC. ModuleManager
ожидает, что сервис ApplicationConfig
внедрён (Di [4]) с ключами module_listener_options
и modules
.
Он создает экземпляр ZendModuleManagerListenerDefaultListenerAggregate
, используя извлеченные module_listener_options
. Затем проверяет, существует ли сервис с именем ServiceListener
, если нет, то использует фабрику с именем ZendMvcServiceServiceListenerFactory
. В ServiceListener
будет добавлено множество сервисов слушателей, таких, как слушатели методов getServiceConfig
, getControllerConfig
, getControllerPluginConfig
, getViewHelperConfig
модуля.
Затем ModuleManager
извлекает сервис EventManager
и присоединяет вышеупомянутых слушателей. Он создает экземпляр ZendModuleManagerModuleEvent
, установив параметр "ServiceManager" в объект менеджера сервисов. Наконец, он создает экземпляр ZendModuleManagerModuleManager
и внедряет EventManager
и ModuleEvent
.
[моё] Тот случай, когда кодом понятнее:
<?php
namespace ZendMvcService;
use ZendModuleManagerListenerDefaultListenerAggregate;
use ZendModuleManagerListenerListenerOptions;
use ZendModuleManagerModuleEvent;
use ZendModuleManagerModuleManager;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
class ModuleManagerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
if (!$serviceLocator->has('ServiceListener')) {
$serviceLocator->setFactory('ServiceListener', 'ZendMvcServiceServiceListenerFactory');
}
$configuration = $serviceLocator->get('ApplicationConfig');
$listenerOptions = new ListenerOptions($configuration['module_listener_options']);
$defaultListeners = new DefaultListenerAggregate($listenerOptions);
$serviceListener = $serviceLocator->get('ServiceListener');
$serviceListener->addServiceManager(
$serviceLocator,
'service_manager',
'ZendModuleManagerFeatureServiceProviderInterface',
'getServiceConfig'
); // то же самое для остальных методов модуля
$events = $serviceLocator->get('EventManager');
$events->attach($defaultListeners);
$events->attach($serviceListener);
$moduleEvent = new ModuleEvent;
$moduleEvent->setParam('ServiceManager', $serviceLocator);
$moduleManager = new ModuleManager($configuration['modules'], $events);
$moduleManager->setEvent($moduleEvent);
return $moduleManager;
}
}
Источник [5]
Архитектура контроллеров включает в себя систему плагинов, которая позволяет добавлять свой код, который будет вызываться при определенных событиях в процессе жизни контроллера. Фронт-контроллер использует брокер плагинов (plugin broker) в качестве реестра пользовательских плагинов, брокер плагинов также обеспечивает вызов методов событий в каждом плагине, зарегистрированном через фронт-контроллер.
Методы событий определены в абстрактном классе Zend_Controller_Plugin_Abstract
, от которого должны наследовать все пользовательские плагины
[моё]
Внимательный читатель заметил, что статья начинается со ссылки на Тостер, где задан вопрос про различия ServiceManager и ModuleManager, и с них же начинается текст статьи. Совпадение? Не думаю. Дело в том, что Хабр стал первым местом, откуда я начал знакомство с основами фреймворка и путаницу внесла публикация [6], где воссоздавался блог из документации с комментариями автора статьи. Именно отсутствие описания ModuleManager толкнуло меня на неправильные рассуждения (что в ServiceManager регистрируются модули) и это привело к написанию данной статьи.
Не хочу заниматься копипастой и выращивать 6 частей на одну тему, поэтому прикладываю список моих закладок по ZF с примечаниями:
В трёх статьях c Хабра
Оригинал документации на блог
Первичный обзор
Подробный разбор
Quick start
Подробный разбор
Документация
Надеюсь, краткий экскурс не слишком затянулся и был полезен. Разумеется, принимаются правки, предложения, критика и другие дозволенные правилами Хабра и действующими законодательствами РФ действия с вашей стороны.
Бонус, который мы заслужили:
(=^・ω・^=)
Автор: Сергей Мелодин
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/osnovy/295642
Ссылки в тексте:
[1] Источник: https://toster.ru/q/569166
[2] дока: https://framework.zend.com/apidoc/2.3/classes/Zend.Mvc.Controller.ControllerManager.html
[3] Источник: https://framework.zend.com/manual/2.1/en/modules/zend.mvc.services.html
[4] Di: https://ru.wikipedia.org/wiki/Внедрение_зависимости
[5] Источник: https://framework.zend.com/manual/1.5/ru/zend.controller.plugins.html
[6] публикация: https://habr.com/post/192522/
[7] https://framework.zend.com/manual/2.4/en/in-depth-guide/first-module.html: https://framework.zend.com/manual/2.4/en/in-depth-guide/first-module.html
[8] https://habr.com/post/131077/: https://habr.com/post/131077/
[9] http://zf2.com.ua/doc/50: http://zf2.com.ua/doc/50
[10] http://zf2.com.ua/doc/64: http://zf2.com.ua/doc/64
[11] http://zf2.com.ua/doc/103: http://zf2.com.ua/doc/103
[12] https://habr.com/post/241471/: https://habr.com/post/241471/
[13] http://zf2.com.ua/doc/98: http://zf2.com.ua/doc/98
[14] Источник: https://habr.com/post/426303/?utm_source=habrahabr&utm_medium=rss&utm_campaign=426303
Нажмите здесь для печати.