Загружать другую конфигурацию в зависимости от результата функции службы в Zend Framework 2.

Возможно ли в ZF2 загрузить другой файл конфигурации (или просто вручную добавить массив в существующую конфигурацию) на основе функции в службе (или модели)?

Если быть точнее, у меня есть (сторонний) модуль, которому нужна куча пользовательских настроек из конфига.

В одном из моих собственных модулей в module.config.php у меня есть пользовательская настройка конфигурации:

'my_custom_config' => array(
    'display_something' => true,
),

Затем в вызываемом сервисе у меня есть функция, скажем, isDisplaySomething(), которая будет определять, является ли display_something истинным или ложным.

Моя первая попытка состояла в том, чтобы вызвать эту функцию в getConfig() из Module.php, а затем добавить ее в конфигурацию в виде массива, но я не могу понять, как получить доступ к службе там.

Затем я попытался перезаписать конфигурацию в onDispatch() в контроллере, но я не могу получить там доступ к ServiceManager (и, вероятно, в любом случае это не очень элегантное решение).

Любые идеи, как решить эту проблему?


person magnetronnie    schedule 25.06.2015    source источник


Ответы (1)


Для зависимостей от значения из конфигурации я бы предложил вам настроить фабрику для создания вашего сервиса. Что-то вроде этого:

<?php

namespace My\Factory;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use My\Service\DisplayService;

/**
 * Factory for creating the DisplayService
 */
class DisplayServiceFactory implements FactoryInterface
{
    /**
     * Create the DisplayService
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return DisplayService
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $config = array();
        if ($serviceLocator->has('config')) {
            $config = $serviceLocator->get('config');
        }

        // Default value in case nothing in config
        // An alternative is to throw an exception if no value found in config.
        $displaySomething = true;

        if(isset($config['my_custom_config'] && isset($config['my_custom_config']['display_something'])){
            $displaySomething = $config['my_custom_config']['display_something'];
        }

        // Use setter to set the value or use constructor dependency.
        $displayService = new DisplayService();
        $displayService->setDisplaySomething($displaySomething);

        return $displayService
    }
}

И затем в вашем module.config.php:

'service_manager' => array(
    'factories' => array(
        'My\Service\DisplayService' => 'My\Factory\DisplayServiceFactory'
    )
)

Теперь вы можете получить услугу у своего сервис-менеджера следующим образом:

$serviceManager->get('My\Service\DisplayService');

и у него будет ваше значение $displaySomething.

person Wilt    schedule 25.06.2015
comment
Спасибо. Мне нравится идея иметь фабрику для обслуживания. Но я боюсь, что это не решит мою настоящую проблему. Это сторонний модуль, которому нужен тот или иной набор конфигураций в зависимости от настройки в Сервисе. Служба не должна читать конфигурацию, а должна изменить ее, если это вообще возможно. - person magnetronnie; 25.06.2015
comment
@magnetronnie Какой модуль вы используете? Не очень правильно устанавливать или перезаписывать значения config из службы? Можно подробнее, зачем это нужно? Это также означает, что массив config может быть разным в зависимости от того, вызывается служба или нет. Это звучит очень странно. Идея массива службы config заключается в том, что он статичен и может кэшироваться. Динамический контент означает, что вы не можете кэшировать config. В производственной среде кэширование действительно необходимо. - person Wilt; 25.06.2015
comment
Это модуль управления активами. Мне не понравились модули, которые я нашел в Интернете, поэтому я написал свой собственный, основанный на других модулях, и все они использовали конфигурацию модуля для установки параметров модулей и добавления ресурсов. Я думаю, вы правы, изменение конфигурации, вероятно, нежелательно. Я постараюсь добавить какой-нибудь способ изменить настройки/активы модуля ассетов из другой модели. Конфигурация может остаться, но действует только как значения по умолчанию. Спасибо за помощь. - person magnetronnie; 29.06.2015