Для написание приложений на Zend Framework рекомендуется использовать сервисы, определенные в Zend\Mvc\Service. В этой главе Вы узнаете про существующие сервисы, какими классами они представлены и возможности их настройки.
Для настройки всех частей MVC системы был создан комплекс сервисов и фабрик, упрощающих этот процесс. Далее мы постараемся дать упрощенное пояснение процесса настройки.
После создания Zend\Mvc\Applicationв работу вступает Zend\ServiceManager\ServiceManager, который настраивается через Zend\Mvc\Service\ServiceManagerConfig. ServiceManagerConfig предоставляет настройки, которые находятся в файле application.config.php, или другом месте, которое Вы можете указать при необходимости. Из всех сервисов и фабрик, находящихся в пространстве имен Zend\Mvc\Service, ServiceManagerConfig отвечает за настройку только трех компонентов: SharedEventManager, EventManager, и ModuleManager.
После этого приложение (Application) вызывает ModuleManager. Далее, ModuleManager настраивает ServiceManager вместе с фабриками и сервисами, находящимися в Zend\Mvc\Service\ServiceLocator. Такой подход делает настройку приложения максимально простой и удобной, а так же дает разработчику возможность настраивать различные части MVC системы изнутри модулей, не обращая внимания на различные настройки по умолчанию.
Это единственный сервис-класс, который ссылается напрямую на загрузчик приложения (bootstrapping).
Он предоставляет следующие возможности:
Invokable сервисы
- DispatchListener (слушатель), соответствует Zend\Mvc\DispatchListener.
- RouteListener (слушатель), соответствует Zend\Mvc\RouteListener
Фабрики
Application, соответствует ZendMvcServiceApplicationFactory.
Config, соответствует Zend\Mvc\Service\ConfigFactory. Берет сервис ModuleManager, и вызывает метод loadModules(), затем получает объединенные настройки от события module. На практике Вы получаете в свое распоряжение все объединенные настройки приложения в одном месте в виде ассоциативного массива.
ControllerLoader, соответствует Zend\Mvc\Service\ControllerLoaderFactory. Это контейнер, с ограниченной областью видимости, который будет заполнен ServiceListener’ером.
Кроме того, этот контейнер, с ограниченной областью видимости настроен на использование сервиса DI, как абстрактного сервиса фабрики - что позволяет использовать DI для установки порядка обращения к контроллерам. Для этого Вы должны добавить контроллеры в «белый» список настроек DI с ключом «allowed_controllers», иначе они будут игнорироваться.
Экземпляр ServiceManager будет инъекцирован в контроллер, при условии, что контроллер реализует интерфейс Zend\ServiceManager\ServiceLocatorAwareInterface.
Экземпляр EventManager будет инъекцирован в контроллер, при условии, что контроллер реализует интерфейс Zend\EventManager\EventManagerAwareInterface.
И последнее, инициализатор будет инъекцировать его в сервис ControllerPluginManager до тех пор, пока выполняется setPluginManager.
ControllerPluginManager, соответствует Zend\Mvc\Service\ControllerPluginManagerFactory.
Создает экземпляр Zend\Mvc\Controller\PluginManager, передавая ему экземпляр Service Manager. Так же настроен на использование сервиса DI, как абстрактного сервиса фабрики - позволяя эффективно использовать DI при задании порядка обращения к плагинам контроллеров.
Он регистрирует набор плагинов контроллеров по умолчанию, а так же содержит инициализатор для инъекцирования плагинов в текущий контроллер.
DependencyInjector, соответствует Zend\Mvc\Service\DiFactory. Сначала обращается к сервису Config, и ищет в массиве ключ «di». Если таковой находится, то использует значение, соответствующие этому ключу для настройки нового экземпляра Zend\Di\Di. Так же DI используется для распространения экземпляра Zend\ServiceManager\Di\DiAbstractServiceFactory, который позже будет прикреплен к service manager как абстрактная фабрика – что позволяет использовать DI как запасной вариант для предоставления сервисов.
EventManager, соответствует Zend\Mvc\Service\EventManagerFactory. Эта фабрика создает статическую ссылку на SharedEventManager, который впоследствии будет инъекцирован в новый экземпляр EventManager. Этот сервис не является общедоступным по умолчанию, однако предоставляет возможность обращаться к EventManager как к сервису с инъекцированым в каждый из них SharedEventManager на основах общего доступа.
ModuleManager, соответствует Zend\Mvc\Service\ModuleManagerFactory.
Это, пожалуй, самая сложная фабрика во всем MVC. Предпологается, что сервис ApplicationConfig был инъекцирован с ключами для module_listener_options и modules.
Создает экземпляр Zend\ModuleManager\Listener\DefaultListenerAggregate, используя для этого полученные «module_listener_options». Так же проверяет, существует ли сервис с именем ServiceListener. Если не существует, то создает экземпляр ServiceListenerFactory. Группа слушателей сервисов будет добавлена в ServiceListener, как слушатели для методов module: getServiceConfig, getControllerConfig, getControllerPluginConfig, getViewHelperConfig.
Затем извлекает сервис EventManager и прикрепляет выше описанные слушатели.
Это создает экземпляр Zend\ModuleManager\ModuleEvent, настраивая тем самым параметр «ServiceManager» для объекта service manager.
В завершение, создается экземпляр Zend\ModuleManager\ModuleManager и инъекцируется EventManager и ModuleEvent.
ServiceListenerFactory, соответствует Zend\Mvc\Service\ServiceListenerFactory.
Эта фабрика используется для создания ServiceListener, позволяя легко расширяться. Проверяет, существует ли сервис с именем «ServiceListenerInterface», который должен реализовать Zend\ModuleManager\Listener\ServiceListenerInterface, прежде, чем создается дефолтный ServiceListener.
Также он получает ApplicationConfig иищетключ «service_listener_options». Это позволяет Вам регистрировать своих слушателей для различных методов модуля и ключи настройки для создания собственных service manager’ов.
Request, соответствует Zend\Mvc\Service\RequestFactory.
Эта фабрика используется для создания и возврата экземпляра запроса (request), основываясь на текущем окружении. Если текущее окружение является CLI, то будет создан Zend\Console\Request, или Zend\Http\PhpEnvironment\Request, если текущее окружение - HTTP.
Response, соответствует Zend\Mvc\Service\ResponseFactory.
Эта фабрика используется для создания и возврата экземпляра запроса (request), основываясь на текущем окружении. Если текущее окружение является CLI, то будет создан Zend\Console\ Response, или Zend\Http\PhpEnvironment\ Response, если текущее окружение - HTTP.
Router, соответствует Zend\Mvc\Service\RouterFactory.
Обращается к сервису Config, ключ router,затем передает его в ZendMvcRouterHttpTreeRouteStack::factory для получения настроенного экземпляра маршрутизации.
ViewManager, соответствует Zend\Mvc\Service\ViewManagerFactory. Эта фабрика используется для создания и возврата view manager’а в соответствии к текущему окржению. Если текущее окружение является CLI, то будет создан Zend\Mvc\View\Console\ViewManager, или Zend\Mvc\View\Http\ViewManager, если текущее окружение - HTTP.
ViewResolver, соответствует Zend\Mvc\Service\ViewResolverFactory.
Создает и возвращает совокупность view resolver. Так же прикрепляет сервисы ViewTemplateMapResolverи ViewTemplatePathStack.
ViewTemplateMapResolver, соответствует Zend\Mvc\Service\ViewTemplateMapResolverFactory.
Создает, настраивает и возвращает Zend\View\Resolver\TemplateMapResolver.
ViewTemplatePathStack, соответствует Zend\Mvc\Service\ViewTemplatePathStackFactory.
Создает, настраивает и возвращает Zend\View\Resolver\TemplatePathStack.
ViewHelperManager, соответствует Zend\Mvc\Service\ViewHelperManagerFactory.
Создает, настраивает и возвращает view helper manager.
ViewFeedRenderer, соответствует Zend\Mvc\Service\ViewFeedRendererFactory.
Создает, настраивает и возвращает экземпляр Zend\View\Renderer\FeedRenderer.
ViewFeedStrategy, соответствует Zend\Mvc\Service\ViewFeedStrategyFactor.
Создает экземпляр Zend\View\Strategy\FeedStrategy с сервисом ViewFeedRenderer.
ViewJsonRenderer, соответствует Zend\Mvc\Service\ViewJsonRendererFactory.
Просто возвращает Zend\View\Renderer\JsonRenderer.
ViewJsonStrategy, соответствует Zend\Mvc\Service\ViewJsonStrategyFactory.
Создает экземпляр Zend\View\Strategy\JsonStrategy с сервисом ViewJsonRenderer
Синонимы ( Aliases )
- Config, соответствует сервису Config.
- Di, соответствует сервису DependencyInjector.
- Zend\EventManager\EventManagerInterface, соответствует сервису EventManager. Это просто страховка, на случай, если не сработает DI, то классы все равно будут инъекцированы через ServiceManager.
- Zend\Mvc\Controller\PluginBroker, соответствует сервису ControllerPluginBroker. Это просто страховка, на случай, если не сработает DI, то классы все равно будут инъекцированы через ServiceManager.
- Zend\Mvc\Controller\PluginLoader, , соответствует сервису ControllerPluginLoader. Это просто страховка, на случай, если не сработает DI, то классы все равно будут инъекцированы через ServiceManager.
Так же регистрируются два инициализатора. Они работают с созданными экземплярами и могут быть использованы для их настройки. Эти два инициализатора создают и регистрируют класс ServiceManagerConfig, и могут быть использованы для:
- объектов, реализующих Zend\EventManager\EventManagerAwareInterface. Будет получен и инъецирован сервис EventManager. Однако этот сервис не является общедоступным. Он создается и инъеируется в каждый экземпляр через общедоступный экземпляр SharedEventManager.
- объектов, реализующих Zend\ServiceManager\ServiceLocatorAwareInterface. ServiceManager будет инъецировать сам себя в объект.
Инаконецто, ServiceManager регистрирует сам себя как сервис ServiceManager, а свой синоним (aliase) в классы Zend\ServiceManager\ServiceManagerInterface and Zend\ServiceManager\ServiceManager.
Слой View компонента Zend\Mvc состоит из довольно большого числа помощников и различных слушателей. Zend\Mvc\View\ViewManager был создан для обеспечения возможности создания различных объектов, а так же их объединения и создания слушателей событий.
ViewManager непосредственно представляет собой слушателя события, настроенного на событие загрузки. Он извлекает ServiceManager из объекта Application, а так же его составляющую - EventManager.
Настройки для всех составляющих ViewManager находятся в общей конфигурации с ключом «view_manager», а значения должны быть из списка, приведенного ниже. Следующие сервисы создаются и управляются с помощью ViewManager:
- ViewHelperManager, составляюаяипсевдоним (alias) Zend\View\HelperPluginManager. Доступенчерез ServiceManager. Создается с помощью Zend\Mvc\Service\ViewHelperManagerFactory.
Сервис Router получается и инъецируется в помощник Url
Если присутствует ключ «base_path», то он используется для инъецирования помощника вида BasePath. Если же его нету, то извлекается сервис Request и используется значение, полученное в его методе getBasePath().
Если присутствует ключ «doctype», то он используется для задания значения помощника вида Doctype.
-ViewTemplateMapResolver, составляющая и псевдоним (alias) Zend\View\Resolver\TemplateMapResolver. Если присутствует ключ «template_map», то он будет использован для заполнения карты шаблона (seed the template map).
-ViewTemplatePathStack, составляющая и псевдоним (alias) Zend\View\Resolver\ViewTemplatePathStack. Если присутствует ключ «template_path_stack», то будет использован для заполнения стека.
-ViewResolver, составляющая и псевдоним (alias) Zend\View\Resolver\AggregateResolver и Zend\View\Resolver\ResolverInterface. Он используется с сервисами ViewTemplateMapResolver и ViewTemplatePathStack как resolver.
-ViewRenderer, составляющая и псевдоним (alias) Zend\View\Renderer\PhpRenderer and Zend\View\Renderer\RendererInterface. Он используется с сервисами ViewResolver and ViewHelperBroker. Кроме того, помощник ViewModel получается/извлекается с уже заполненной ViewModel в качестве корневой модели (макета)
-ViewPhpRendererStrategy, составляющая и псевдоним (alias) Zend\View\Strategy\PhpRendererStrategy. Используется с сервисом ViewRenderer.
-View, составляющая и псевдоним (alias) Zend\View\View. Используется с сервисом EventManager , а так же присоединяет ViewPhpRendererStrategy как общий слушатель.
-DefaultRenderingStrategy, составляющая и псевдоним (alias) Zend\Mvc\View\DefaultRenderingStrategy. Если присутствует ключ «layout», то он используется для заполнения шаблона макета стратегии (seed the strategy’s layout template.). Входит в состав сервиса View.
-ExceptionStrategy, составляющая и псевдоним (alias) Zend\Mvc\View\ExceptionStrategy.
Если присутствует один из ключей «display_exceptions» или «exception_template», то они используются для настройки стратегии(strategy).
- RouteNotFoundStrategy, составляющая и псевдоним (alias) Zend\Mvc\View\RouteNotFoundStrategy и 404Strategy. Если присутствует один из ключей «display_not_found_reason» или «not_found_template», то они используются для настройки стратегии(strategy).
- ViewModel. Нет никаких зарегистрированных сервисов. ViewModel просто извлекается из MvcEvent и инъецируется в макет с именем шаблона.
ViewManager так же создает несколько дополнительных слушателей, но не предоставляет их как сервисы: Zend\Mvc\View\CreateViewModelListener, Zend\Mvc\View\InjectTemplateListener, и Zend\Mvc\View\InjectViewModelListener. Они, как и RouteNotFoundStrategy, ExceptionStrategy, DefaultRenderingStrategy прикрепляются как слушатели к экземпляру приложения EventManager или SharedEventManager.
В итоге, если в настройках имеются ключи стратегий (strategies key), то ViewManager циклически по порядку будет прикреплять их к сервису View с приоритетом 100. Это позволит им выполниться до DefaultRenderingStrategy.
Параметры конфигурации приложения
Следующие настройки могут быть использованы для начальной конфигурации экземпляров ServiceManager, ModuleManager, Application, позволяющие им находить и объединять настройки, используемые для сервиса Config, которая в свою очередь предназначена настройки всех остальных объектов в системе. Следующие настройки используются в файле config/application.config.php.
<?php return array( // This should be an array of module namespaces used in the application. 'modules' => array( ), // These are various options for the listeners attached to the ModuleManager 'module_listener_options' => array( // This should be an array of paths in which modules reside. // If a string key is provided, the listener will consider that a module // namespace, the value of that key the specific path to that module's // Module class. 'module_paths' => array( ), // An array of paths from which to glob configuration files after // modules are loaded. These effectively overide configuration // provided by modules themselves. Paths may use GLOB_BRACE notation. 'config_glob_paths' => array( ), // Whether or not to enable a configuration cache. // If enabled, the merged configuration will be cached and used in // subsequent requests. 'config_cache_enabled' => $booleanValue, // The key used to create the configuration cache file name. 'config_cache_key' => $stringKey, // Whether or not to enable a module class map cache. // If enabled, creates a module class map cache which will be used // by in future requests, to reduce the autoloading process. 'module_map_cache_enabled' => $booleanValue, // The key used to create the class map cache file name. 'module_map_cache_key' => $stringKey, // The path in which to cache merged configuration. 'cache_dir' => $stringPath, ), // Used to create an own service manager. May contain one or more child arrays. 'service_listener_options' => array( array( 'service_manager' => $stringServiceManagerName, 'config_key' => $stringConfigKey, 'interface' => $stringOptionalInterface, 'method' => $stringRequiredMethodName, ), ) // Initial configuration with which to seed the ServiceManager. // Should be compatible with ZendServiceManagerConfig. 'service_manager' => array( ), );
Параметры
конфигурации по умолчанию
Следующие опции доступны при использовании по умолчанию настроек ServiceManagerConfig и ViewManager.
. Следующие настройки используются в файле config/autoload/{,*.}{global,local}.php, или в файле настройки module/<module name>/config/module.config.php. За объединение настроек в этих файлах отвечает ModuleManager. Сначала объединяются файлы module.config.php каждого модуля, а потом файлы из директории config/autoload (сначала файлы *.global.php, потом *.local.php). Порядок сливания файлов организован таким образом, что у Вас есть возможность перезаписать настройки модуля настройками приложения. Например, если у Вас есть два файла config/autoload/my.global.config.php и config/autoload/my.local.config.php, то настройки в файле «local» перезапишут то, что было в «global».
Warning!
Файлы конфигурации «local» предназначены для хранения конфиденциальной информации, например такой, как учетные данные базы данных, поэтому рекомендуется держать эти файлы вне Вашего VCS (Version Control System, Система управления версиями). В ZendSkeletonApplication config/autoload/.gitignore игнорирует файлы «*.local.php» по умолчанию.
<?php return array( // The following are used to configure controller loader // Should be compatible with ZendServiceManagerConfig. 'controllers' => array( // Map of controller "name" to class // This should be used if you do not need to inject any dependencies // in your controller 'invokables' => array( ), // Map of controller "name" to factory for creating controller instance // You may provide either the class name of a factory, or a PHP callback. 'factories' => array( ), ), // The following are used to configure controller plugin loader // Should be compatible with ZendServiceManagerConfig. 'controller_plugins' => array( ), // The following are used to configure view helper manager // Should be compatible with ZendServiceManagerConfig. 'view_helpers' => array( ), // The following is used to configure a ZendDiDi instance. // The array should be in a format that ZendDiConfig can understand. 'di' => array( ), // Configuration for the Router service // Can contain any router configuration, but typically will always define // the routes for the application. See the router documentation for details // on route configuration. 'router' => array( 'routes' => array( ), ), // ViewManager configuration 'view_manager' => array( // Base URL path to the application 'base_path' => $stringBasePath, // Doctype with which to seed the Doctype helper 'doctype' => $doctypeHelperConstantString, // e.g. HTML5, XHTML1 // TemplateMapResolver configuration // template/path pairs 'template_map' => array( ), // TemplatePathStack configuration // module/view script path pairs 'template_path_stack' => array( ), // Layout template name 'layout' => $layoutTemplateName, // e.g., 'layout/layout' // ExceptionStrategy configuration 'display_exceptions' => $bool, // display exceptions in template 'exception_template' => $stringTemplateName, // e.g. 'error' // RouteNotFoundStrategy configuration 'display_not_found_reason' => $bool, // display)gt;/span 404 reason in template 'not_found_template' => $stri color:#666666;font-style:inbsp;taliccolor:#009900ngTemplateName, // e.g. '404' // Additional strategies to attach // These should be class names or service names of View strategy classes // that act as ListenerAggregates. They will be attached at priority 100, // in the order registered. 'strategies' => array( 'ViewJsonStrategy', // register JSON renderer strategy 'ViewFeedStrategy', // register Feed renderer strategy ), ), );