Разница между классами Service и Manager в Zend Framework 2

Я немного запутался в суффиксе имени класса Manager и Service.

Насколько я понимаю разницу, Managers отвечают за обработку (создание, извлечение, удаление,...) определенных типов сущностей. Например, ModuleManager отвечает за загрузку и возврат Modules. В этом случае вам действительно нужна реальная сущность, Module.

Однако Services — это классы, предоставляющие интерфейсы для выполнения определенных типов логики процессов. Например, LogService отправляет заданное сообщение журнала определенному средству записи журнала. Вам все равно, куда он идет и что делает, вы просто хотите, чтобы администратор был проинформирован о том, что только что произошло.

Теперь ZF2 предоставляет ServiceManager, который создает и возвращает экземпляры заданного Service. Я случайно привык создавать Managers и предоставлять factory для ServiceManager, чтобы вы могли получить доступ к Manager, используя $this->getServiceLocator()->get('managerName'); в контексте Controller, чтобы сохранить крошечные контроллеры и реальную логику в тестируемых классах. Это та часть, которая меня сейчас смущает, потому что, очевидно, нельзя рекомендовать извлекать Managers с помощью ServiceLocator. НО: я не единственный, кто делает это: модуль Doctrine ORM является еще одним примером этого: он регистрирует EntityManager как doctrine.entitymanager.orm_default Service по умолчанию.

Я неправильно понимаю истинную разницу между Services и Managers? Есть ли вообще разница? Возможно, Managers унаследованы от Services в концепте?


person Daniel M    schedule 04.09.2012    source источник


Ответы (1)


Попробую для вас разобрать менеджеры и сервисы в ZF2.

Менеджеры

К сожалению, слово «менеджер» по отношению к классам невероятно двусмысленно, и в ZF2 есть некоторое несоответствие тому, как это слово используется. Таким образом, действительно нет авторитетного определения того, что такое «менеджер» в ZF2. В настоящее время «менеджеров» в ZF2 лучше всего разделить следующим образом:

  • ServiceManager — экземпляр Zend\ServiceManager\ServiceManager. Может быть несколько экземпляров ServiceManager — по умолчанию есть только «основной» диспетчер служб, который настраивается с помощью ключа конфигурации «services» или массива(ов), возвращаемого методом getServiceConfig() модуля.
  • Менеджеры подключаемых модулей. Они расширяют Zend\ServiceManager\PluginManager, который расширяет Zend\ServiceManager\ServiceManager некоторыми специализированными функциями. Они распределены по многим компонентам фреймворка и обеспечивают функциональность того, что ранее было известно (в более ранних версиях ZF2) как загрузчики/брокеры подключаемых модулей. Эти менеджеры плагинов инициализируют такие вещи, как помощники представлений, плагины контроллера и сами контроллеры.
  • Другие «менеджеры» – например, Zend\ModuleManager\ModuleManager и Zend\Session\SessionManager. Они не имеют ничего общего с ServiceManager, а просто имеют суффикс «Менеджер» к своему имени.

Я думаю, вы можете запутаться, пытаясь дать определение термину (менеджеру), который не был разработан с учетом какого-либо конкретного определения. Как автор Zend\ModuleManager могу вам сказать, что я изначально разрабатывал компонент как Zend\Module (мне очень не нравится суффикс Manager). На одной из наших еженедельных встреч IRC было решено, что Zend\Module неоднозначно и что добавление к нему суффикса «менеджер» каким-то образом разрешит эту двусмысленность. Очевидно, я проиграл голосование по этому вопросу. Я хочу сказать, что Zend\ModuleManager не был разработан для того, чтобы быть «менеджером», по любому определению.

Услуги

В ZF2, что касается Zend\ServiceManager, «сервисы» — это просто объекты (технически они также могут быть массивами). Компонент ServiceManager можно рассматривать как простой реестр ключей и значений для различных «служб» (объектов), которые могут понадобиться вашему приложению. Эти «сервисы» обычно представляют собой такие вещи, как настроенная почтовая программа, регистратор, адаптер базы данных, конфигурация приложения и т. д. Конечно, ServiceManager — это не просто простой реестр, и его основная функция — отложить создание экземпляра сервисы (и их зависимости) до тех пор, пока они действительно не понадобятся; ленивая загрузка); Я написал сообщение в блоге, в котором подробно объясняются различные функции ServiceManager.

Я случайно привык создавать Менеджеры и предоставлять фабрику для ServiceManager, чтобы вы могли получить доступ к Менеджеру, используя $this->getServiceLocator()->get('managerName)

Я думаю, что в этом случае вы можете путать термин «менеджер» с «сервисом». Вещи, зарегистрированные в ServiceManager, можно просто называть «сервисами». Это может сбивать с толку, потому что вы действительно можете зарегистрировать какой-то «менеджер» в качестве службы. Например, у вас может быть служба «сеанс», которая является экземпляром Zend\Session\SessionManager. Возникает дальнейшая путаница, поскольку термин "сервис" обычно относится к классу, который составляет часть уровня сервиса.

Так что, к сожалению, да, терминология в ZF2 может быть немного туманной, но как только вы поймете пару относительно простых основных концепций, отличный дизайн действительно откроет удивительную гибкость, которая, на мой взгляд, не имеет себе равных в большинстве других существующие фреймворки.

Надеюсь это поможет.

person EvanDotPro    schedule 05.09.2012
comment
Эван, спасибо за этот отличный ответ, это очень помогает! Теперь мне нужно подумать, как называть менеджеров в будущем и что делать с моими существующими, но это нормально. Спасибо! - person Daniel M; 05.09.2012
comment
Это действительно очень ясно, и я предлагаю включить это во введение документации ZF2 в параграф под названием «Терминология ZF2» или аналогичный. - person markus; 15.12.2012
comment
Вы (или кто-либо другой) имеете полное разрешение включить/перефразировать это в документацию ZF2. Любой может внести свой вклад в документацию на странице github.com/zendframework/zf2-documentation. Я просто не уверен, когда / если у меня будет время, чтобы добраться до этого в противном случае. :) - person EvanDotPro; 08.07.2013