是否可以在ZF2中根据服务(或模型)中的函数加载不同的配置文件(或者只是手动将数组添加到现有配置中)?
更确切地说,我有一个(第三方)模块需要配置中的一堆自定义设置。
在我自己的一个模块中,module.config.php
我有一个自定义配置设置:
'my_custom_config' => array(
'display_something' => true,
),
然后在一个可调用的服务中,我有一个函数,比如isDisplaySomething()
,它将决定display_something是真还是假。
我的第一次尝试是在getConfig()
Module.php
中调用该函数,然后将其作为数组添加到配置中,但我无法弄清楚如何在那里访问服务。
然后我尝试覆盖控制器中onDispatch()
的配置,但我无法访问那里的ServiceManager(而且它可能不是一个非常优雅的解决方案)。
任何想法如何解决这个问题?
答案 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
值。