Содержание


Default Services


Default Services, сервисы по умолчанию, ЗФ2, Zend Framework 2, ZF2, ру, ru




Для написание приложений на  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 системы изнутри модулей, не обращая внимания на различные настройки по умолчанию.

 


ServiceManager

 

Это единственный сервис-класс, который ссылается напрямую на загрузчик приложения (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.

 


ViewManager

 

Слой 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
        ),
    ),
);

Автор статьи: DuB