Короткий екскурс по основних моментах Zend Framework

Це просто фреймворк, або цей фреймворк уособлює собою гордість PHP-спільноти — його працьовитих розробників, так би мовити, ключовий інгредієнт? З розсипом конфіги… Предмет любові нашого МП, володіє хорошим MVC, завдяки чому Zend Framework — найкращий фреймворк на PHP.

Тут ви не знайдете відповіді на це питання, зате дізнаєтеся про ServiceManager і ModuleManager.

 

Попередження

  1. Даний матеріал заснований на тому, що я шукав по Zend Framework 2, подекуди фігурують навіть згадки за версією 1.*. Не думаю, що це стане проблемою при зіставленні з іншими версіями, так як розглядаються фундаментальні моменти і навряд чи вони глобально зміняться.
  2. В міркуваннях і перекладах (а також в пункті 1) можуть виявитися грубі помилки, як мої, так і першоджерел. На всі будуть дані посилання, а власна творчість буде з приміткою [моє].
  3. Орієнтоване на тих, хто погуглив і, як я заплутався. Тут не буде розгортання блогів, пояснень та інтерактиву. Але буде дві картинки і кішечка.

 

Зміст

  • Терміни
  • Пристрій фреймворку
    • Загальна структура та зв’язку
    • Плагіни
  • Візуалізація
    • Зв’язку
    • Схематичне уявлення
  • Від автора
    • Корисні посилання
  • Бонус

 

Терміни

  • Додаток — кінцевий продукт, сайт;
  • Модуль — це функціонально завершений блок програми, код якого може складатися з моделей, уявлень, контролерів. Модуль розширює функціональні можливості веб-додатка і може функціонувати лише “всередині” нього; Модулі реєструються в application.config.php у секції modules
  • ModuleManager — контейнер для маніпуляцій модулями;
  • Сервіс — “механізм” в модулі, для маніпуляцій між моделями, контролерами, видами, інше; Сервіси реєструються в module.config.php у секції service_manager.
  • ServiceManager — контейнер для маніпуляцій сервісами.
  • ControllerManager — працює з сервісами і фабриками для завантаження контролерів (ZendServiceManagerAbstractFactoryInterface або ZendServiceManagerServiceManager). дока
  • EventManager — компонент, який агрегує обробники подій (Listener) для одного і більше іменованих подій (Event), а також ініціює обробку цих подій.
  • Плагін — клас, який певним чином розширює функціональність всіх контролерів.
Читайте також  Як зробити пошук користувачів з Github використовуючи Angular

 

Пристрій фреймворку

 

Загальна структура та зв’язку

Джерело

Коли створюється 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.
Читайте також  Налаштування програми — Spring Configuration Metadata

 

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.

Сподіваюся, короткий екскурс не надто затягнувся і був корисний. Зрозуміло, приймаються правки, пропозиції, критика та інші дозволені правилами Хабра і діючими законодавствами РФ дії з вашого боку.

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *