根据Zend Framework 2中服务功能的结果加载不同的配置

时间:2015-06-25 07:04:10

标签: php zend-framework2 zend-framework-mvc

是否可以在ZF2中根据服务(或模型)中的函数加载不同的配置文件(或者只是手动将数组添加到现有配置中)?

更确切地说,我有一个(第三方)模块需要配置中的一堆自定义设置。

在我自己的一个模块中,module.config.php我有一个自定义配置设置:

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

然后在一个可调用的服务中,我有一个函数,比如isDisplaySomething(),它将决定display_something是真还是假。

我的第一次尝试是在getConfig() Module.php中调用该函数,然后将其作为数组添加到配置中,但我无法弄清楚如何在那里访问服务。

然后我尝试覆盖控制器中onDispatch()的配置,但我无法访问那里的ServiceManager(而且它可能不是一个非常优雅的解决方案)。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

对于来自配置的值的依赖关系,我建议您设置工厂来创建服务。像这样:

<?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值。