在Zend Framework 2中获取全局配置


Get global config in Zend Framework 2

之前有人问过我的问题。我还想访问我的全局配置(config/{,*.}{global,local}.php)位于我的个人库(在供应商目录中)。我想我找到的最接近的答案在这里。我在我的类中创建了函数

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'funcservice' =>  function('Zend'ServiceManager'ServiceLocatorInterface $sm) {
                $config = $sm->get('config');
            }
        )
    );
}

它可以工作,但是我不知道如何从结果中得到任何东西。

$config = $this->getServiceConfig();
print_r($config);

给我

Array
(
[factories] => Array
    (
        [funcservice] => Closure Object
            (
                [this] => Tools'Model'StandartFuncs Object
                    (
                        [eventIdentifier:protected] => Zend'Mvc'Controller'AbstractActionController
                        [plugins:protected] => 
                        [request:protected] => 
                        [response:protected] => 
                        [event:protected] => 
                        [events:protected] => 
                        [serviceLocator:protected] => 
                    )
                [parameter] => Array
                    (
                        [$sm] => <required>
                    )
            )
    )
)

$config = $this->getServiceConfig()->get('locales');得到

致命错误:在非对象上调用成员函数get()

假设您有一个区域设置配置文件locales.local.php:

<?php
return array(
    'hostname' => 'http://apachehost'
);

这些全局和本地配置文件应该在config/autoload文件夹中。

文件夹结构:

- root
  - config
    - autoload
      - locales.global.php
      - locales.local.php
    - application.config.php

然后在application.config.php中使用以下行加载它们。关于这个高级配置的详细信息,您可以在ZF2文档

中阅读。
'module_listener_options' => array(
    'config_glob_paths' => array(
        'config/autoload/{{,*.}global,{,*.}local}.php',
    ),
)

现在你可以从ServiceManager实例访问你的配置,像这样:

$config = $serviceManager->get('Config');

这个$config变量是一个数组。所以你不能用getter访问任何东西。你应该使用数组表示法:

$locales = $config['locales'];

如果你真的想使用getter,那么你必须把你的配置变成一个对象。您可以使用Zend'Config'Config类这样做:

$config = new 'Zend'Config'Config($config, false);

现在你可以像你在问题中写的那样访问:

$config->get('locales');

更新

如果您想从供应商模块加载自动配置文件,通常的做法是将模块附带的*.local.php和/或*.global.php文件复制到autolload文件夹并根据您的需要编辑复制的文件。

我认为你还没有完全理解你想要实现的解决方案。添加到服务配置中的工厂需要返回库类的一个实例。将它放在工厂中的原因是可以将配置数组注入其中。所以你的代码应该看起来像这样:

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'funcservice' =>  function('Zend'ServiceManager'ServiceLocatorInterface $sm) {
                $config = $sm->get('config');
                return new 'SomeLibrary($config);
            }
        )
    );
}

(其中SomeLibrary/vendor中库类的名称)。

你将需要使用服务管理器实例化你的库类,无论何时你需要访问它,例如在控制器中:

public function someAction()
{
    $yourLibrary = $this->getServiceLocator()->get('funcservice');
}

这将创建一个库类的实例,将config数组作为构造函数传递给第一个参数。您应该永远不需要自己调用getServiceConfig(),这不会实现任何目标。