Ist es nur ein Framework oder verkörpert dieses Framework den Stolz der PHP-Community - ihre fleißigen Entwickler sozusagen eine Schlüsselzutat? Mit einer Streuung von Konfigurationen ... Das Thema der Liebe unseres PL, der eine gute MVC hat, so ist das Zend Framework das beste PHP-Framework.
Hier finden Sie keine Antwort auf diese Frage, aber Sie erfahren mehr über ServiceManager und ModuleManager.

Warnung
- Dieses Material basiert auf dem, wonach ich in Zend Framework 2 gesucht habe, an einigen Stellen erscheinen sogar Erwähnungen von Version 1. *. Ich denke nicht, dass dies im Vergleich zu anderen Versionen zu einem Problem werden wird, da die grundlegenden Punkte berücksichtigt werden und es unwahrscheinlich ist, dass sie sich global ändern.
- In Begründungen und Übersetzungen (sowie in Absatz 1) kann es zu groben Fehlern kommen, sowohl bei meinen als auch bei den Originalquellen. Alle erhalten Links, und Ihre eigene Arbeit wird mit einer Notiz [meiner] versehen .
- Es richtet sich an diejenigen, die googeln und wie ich verwirrt wurden. Es werden keine Blogs, Erklärungen und Interaktivität bereitgestellt. Aber es wird zwei Bilder und ein Kätzchen geben.
Inhalt
- Bedingungen
- Geräte-Framework
- Allgemeine Struktur und Beziehungen
- Plugins
- Visualisierung
- Kommunikation
- Schematische Darstellung
- Vom Autor
- Bonus
Bedingungen
Quelle , ein wenig [meins] .
- Anwendung - das Endprodukt, Standort;
- Ein Modul ist ein funktional abgeschlossener „Block“ einer Anwendung, dessen Code aus Modellen, Darstellungen und Steuerungen bestehen kann. Das Modul erweitert die Funktionalität einer Webanwendung und kann nur "innerhalb" funktionieren. Module werden in
application.config.php
im Abschnitt Module registriert - ModuleManager - ein Container zum Bearbeiten von Modulen;
- Service - "Mechanismus" im Modul für Manipulationen zwischen Modellen, Steuerungen, Typen usw. Dienste werden in
module.config.php
im Abschnitt module.config.php
service_manager
. - ServiceManager - ein Container zum Bearbeiten von Diensten.
- ControllerManager - arbeitet mit Diensten und Fabriken zum Laden von Controllern (
\Zend\ServiceManager\AbstractFactoryInterface
oder \Zend\ServiceManager\ServiceManager
). Dock - EventManager - eine Komponente, die Ereignishandler (Listener) für ein oder mehrere benannte Ereignisse (Ereignis) aggregiert und auch die Verarbeitung dieser Ereignisse initiiert.
- Ein Plugin ist eine Klasse, die die Funktionalität aller Controller in irgendeiner Weise erweitert.
Geräte-Framework
Allgemeine Struktur und Beziehungen
Quelle
Wenn Zend\Mvc\Application
, wird das Objekt Zend\ServiceManager\ServiceManager
über Zend\Mvc\Service\ServiceManagerConfig
erstellt und konfiguriert. ServiceManagerConfig
ruft die Konfiguration von config/application.config.php
(oder einer anderen Anwendungskonfiguration, die beim Erstellen an Application
wird). Von allen im Namespace Zend\Mvc\Service
dargestellten Diensten und Fabriken ist ServiceManagerConfig
nur für drei verantwortlich: SharedEventManager
, EventManager
und ModuleManager
.
Danach ModuleManager
Application
den ModuleManager
. Zu diesem Zeitpunkt konfiguriert der ModuleManager
über den ServiceManager
die in Zend\Mvc\Service\ServiceListenerFactory
bereitgestellten Dienste und Fabriken. Dieser Ansatz ermöglicht es uns, die Konfiguration der Hauptanwendung zu vereinfachen und dem Entwickler die Möglichkeit zu geben, verschiedene Teile des MVC-Systems aus Modulen heraus zu konfigurieren, wobei alle Standardkonfigurationen in den Diensten dieser MVCs überschrieben werden.
ModuleManager
, ausgedrückt in Zend\Mvc\Service\ModuleManagerFactory
. Dies ist möglicherweise die komplexeste Fabrik im MVC-Stack. ModuleManager
erwartet, dass der ApplicationConfig
Dienst mit den Schlüsseln module_listener_options
und modules
bereitgestellt wird ( Di ).
Es erstellt eine Instanz von Zend\ModuleManager\Listener\DefaultListenerAggregate
Verwendung der extrahierten module_listener_options
. Anschließend wird überprüft, ob ein Dienst mit dem Namen Zend\Mvc\Service\ServiceListenerFactory
wird eine Factory mit dem Namen Zend\Mvc\Service\ServiceListenerFactory
. Dem getServiceConfig
viele Listener-Services hinzugefügt, z. B. die Listener des getServiceConfig
, getControllerConfig
, getControllerPluginConfig
und getViewHelperConfig
.
ModuleManager
dann den ModuleManager
Dienst ab und hängt die oben genannten Listener an. Es erstellt eine Instanz von Zend\ModuleManager\ModuleEvent
indem der Parameter "ServiceManager" auf das Service Manager-Objekt gesetzt wird. Schließlich erstellt er eine Instanz von Zend\ModuleManager\ModuleManager
und implementiert EventManager
und ModuleEvent
.
[meins] Der Fall, wenn der Code klarer ist:
<?php namespace Zend\Mvc\Service; use Zend\ModuleManager\Listener\DefaultListenerAggregate; use Zend\ModuleManager\Listener\ListenerOptions; use Zend\ModuleManager\ModuleEvent; use Zend\ModuleManager\ModuleManager; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class ModuleManagerFactory implements FactoryInterface { public function createService(ServiceLocatorInterface $serviceLocator) { if (!$serviceLocator->has('ServiceListener')) { $serviceLocator->setFactory('ServiceListener', 'Zend\Mvc\Service\ServiceListenerFactory'); } $configuration = $serviceLocator->get('ApplicationConfig'); $listenerOptions = new ListenerOptions($configuration['module_listener_options']); $defaultListeners = new DefaultListenerAggregate($listenerOptions); $serviceListener = $serviceLocator->get('ServiceListener'); $serviceListener->addServiceManager( $serviceLocator, 'service_manager', 'Zend\ModuleManager\Feature\ServiceProviderInterface', 'getServiceConfig' );
Plugins
Quelle
Die Controller-Architektur enthält ein Plug-In-System, mit dem Sie Ihren eigenen Code hinzufügen können, der aufgerufen wird, wenn bestimmte Ereignisse während der Lebensdauer des Controllers auftreten. Der Front-Controller verwendet einen Plugin-Broker als Registrierung für Benutzer-Plugins. Der Plugin-Broker bietet auch einen Aufruf von Ereignismethoden in jedem über den Front-Controller registrierten Plugin.
Ereignismethoden sind in der abstrakten Klasse Zend_Controller_Plugin_Abstract
, von der alle Benutzer-Plugins erben müssen
Visualisierung
[meins]
- Es wird von oben nach unten gelesen, sofern nicht durch Pfeile anders angegeben.
- Pfeillinien zeigen an, was enthalten ist.
- Dünne Linien ohne Pfeile zeigen an, was verbunden ist.
- Dicke Linien ohne Pfeile zeigen an, welche Steuerelemente verwendet werden.
Kommunikation

Schema

Vom Autor
Der aufmerksame Leser stellte fest, dass der Artikel mit einem Link zum Toaster beginnt, in dem eine Frage zu den Unterschieden zwischen ServiceManager und ModuleManager gestellt wird und der Text des Artikels mit diesen beginnt. Zufall? Ich glaube nicht. Tatsache ist, dass Habr der erste Ort war, an dem ich anfing, mich mit den Grundlagen des Frameworks vertraut zu machen, und die Veröffentlichung Verwirrung stiftete, wo ein Blog aus der Dokumentation mit Kommentaren des Autors des Artikels neu erstellt wurde. Es war das Fehlen einer Beschreibung von ModuleManager, das mich zu der falschen Argumentation führte (dass Module im ServiceManager registriert sind), und dies führte zum Schreiben dieses Artikels.
Nützliche Links
Ich möchte mich nicht mit Kopieren und Einfügen beschäftigen und 6 Teile zu einem Thema erweitern. Daher füge ich eine Liste meiner Lesezeichen auf ZF mit folgenden Notizen bei:
Achtung Spoiler!Der Blog
In drei Artikeln von Habr
- https://habr.com/post/192522/
- Kostenlose Übersetzung der Dokumentation zur Entwicklung eines einfachen Blogs auf ZendSkeletonApplication. Es geht um Konfigurationen, ServiceManager (oder ModuleManager, den ich immer noch nicht verstehe) und das Verbinden von Bibliotheken von Drittanbietern.
Original Blog Dokumentation
Eventmanager
Primäre Überprüfung
Detaillierte Analyse
Servicemanager
Schnellstart
Detaillierte Analyse
Modulemanager
Die Dokumentation
Ich hoffe der kurze Ausflug war nicht zu lang und hat sich bewährt. Natürlich werden Änderungen, Vorschläge, Kritik und andere Maßnahmen, die nach den Habr-Regeln und den geltenden Gesetzen der Russischen Föderation von Ihrer Seite zulässig sind, akzeptiert.
Bonus, den wir verdienen:
Kitty
(= ^ ・ Ω ・ ^ =)