Короткий екскурс по основних моментах Zend Framework
Це просто фреймворк, або цей фреймворк уособлює собою гордість PHP-спільноти — його працьовитих розробників, так би мовити, ключовий інгредієнт? З розсипом конфіги… Предмет любові нашого МП, володіє хорошим MVC, завдяки чому Zend Framework — найкращий фреймворк на PHP.
Тут ви не знайдете відповіді на це питання, зате дізнаєтеся про ServiceManager і ModuleManager.
Попередження
- Даний матеріал заснований на тому, що я шукав по Zend Framework 2, подекуди фігурують навіть згадки за версією 1.*. Не думаю, що це стане проблемою при зіставленні з іншими версіями, так як розглядаються фундаментальні моменти і навряд чи вони глобально зміняться.
- В міркуваннях і перекладах (а також в пункті 1) можуть виявитися грубі помилки, як мої, так і першоджерел. На всі будуть дані посилання, а власна творчість буде з приміткою [моє].
- Орієнтоване на тих, хто погуглив і, як я заплутався. Тут не буде розгортання блогів, пояснень та інтерактиву. Але буде дві картинки і кішечка.
Зміст
- Терміни
- Пристрій фреймворку
- Загальна структура та зв’язку
- Плагіни
- Візуалізація
- Зв’язку
- Схематичне уявлення
- Від автора
- Корисні посилання
- Бонус
Терміни
- Додаток — кінцевий продукт, сайт;
- Модуль — це функціонально завершений блок програми, код якого може складатися з моделей, уявлень, контролерів. Модуль розширює функціональні можливості веб-додатка і може функціонувати лише “всередині” нього; Модулі реєструються в
application.config.php
у секціїmodules
- ModuleManager — контейнер для маніпуляцій модулями;
- Сервіс — “механізм” в модулі, для маніпуляцій між моделями, контролерами, видами, інше; Сервіси реєструються в
module.config.php
у секціїservice_manager
. - ServiceManager — контейнер для маніпуляцій сервісами.
- ControllerManager — працює з сервісами і фабриками для завантаження контролерів (
ZendServiceManagerAbstractFactoryInterface
абоZendServiceManagerServiceManager
). дока - EventManager — компонент, який агрегує обробники подій (Listener) для одного і більше іменованих подій (Event), а також ініціює обробку цих подій.
- Плагін — клас, який певним чином розширює функціональність всіх контролерів.
Пристрій фреймворку
Загальна структура та зв’язку
Джерело
Коли створюється 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) з ключами 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;
}
}
Плагіни
Архітектура контролерів включає в себе систему плагінів, яка дозволяє додавати свій код, який буде викликатися при певних подіях в процесі життя контролера. Фронт-контролер використовує брокер плагінів (plugin broker) в якості реєстру користувальницьких плагінів, брокер плагінів також забезпечує виклик методів подій в кожному плагіні, зареєстрованому через фронт-контролер.
Методи подій визначені в абстрактному класі Zend_Controller_Plugin_Abstract
, від якого повинні наслідувати всі плагіни
Візуалізація
- Читається зверху вниз, якщо не встановлено інше стрілками.
- Лінії зі стрілками вказують що входить.
- Тонкі лінії без стрілки вказують що з чим пов’язано.
- Товсті лінії без стрілки вказують що управляє.
Зв’язку
Схема
Від автора
Уважний читач помітив, що стаття починається з посилання на Тостер, де поставлено питання про відмінності ServiceManager і ModuleManager, і з них же починається текст статті. Збіг? Не думаю. Справа в тому, що Хабр став першим місцем, звідки я почав знайомство з основами фреймворку і внесла плутанину публікація, де відтворювався блог документації з коментарями автора статті. Саме відсутність опису ModuleManager штовхнуло мене на неправильні міркування (що в ServiceManager реєструються модулі) і це призвело до написання даної статті.
Корисні посилання
Не хочу займатися копипастой і вирощувати 6 частин на одну тему, тому прикладаю список моїх закладок за ZF з примітками:
Обережно, спойлер!
Блог
У трьох статтях c Хабра
- https://habr.com/post/192522/
- Вільний переклад документації по розробці простого блогу на ZendSkeletonApplication. Розповідається про конфігах, ServiceManager (або ModuleManager, я так і не зрозумів) і підключення сторонніх бібліотек.
Оригінал документації на блозі
- https://framework.zend.com/manual/2.4/en/in-depth-guide/first-module.html
EventManager
Первинний огляд
- https://habr.com/post/131077/
- Швидкий огляд нового (на момент публікації) інструменту.
Докладний розбір
- http://zf2.com.ua/doc/50
- Документація з української спільноти за ZF.
ServiceManager
Quick start
- http://zf2.com.ua/doc/64, http://zf2.com.ua/doc/103
- Документація з української спільноти за ZF.
Докладний розбір
- https://habr.com/post/241471/
- Invokable, фабрики та інші незрозумілі штуки.
ModuleManager
Документація
- http://zf2.com.ua/doc/98
- Документація з української спільноти за ZF.
Сподіваюся, короткий екскурс не надто затягнувся і був корисний. Зрозуміло, приймаються правки, пропозиції, критика та інші дозволені правилами Хабра і діючими законодавствами РФ дії з вашого боку.