在Zend Framework 2中获取全局配置

时间:2015-09-16 08:49:59

标签: php zend-framework2 config service-locator

我的问题是before。我还想访问位于我的个人库(在供应商目录中)的全局配置(config / {,*。} {global,local} .php)。我认为最接近的答案是here。我在班上创建了函数

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()

2 个答案:

答案 0 :(得分:2)

假设您有一个语言环境配置文件<?php return array( 'hostname' => 'http://apachehost' );

config/autoload

这些全局和本地配置文件应位于- root - config - autoload - locales.global.php - locales.local.php - application.config.php 文件夹中。

文件夹结构:

application.config.php

然后使用'module_listener_options' => array( 'config_glob_paths' => array( 'config/autoload/{{,*.}global,{,*.}local}.php', ), ) 中的以下行加载它们。有关此高级配置的详细信息,请参阅here in the ZF2 documentation

ServiceManager

现在,您可以从$config = $serviceManager->get('Config'); 实例访问您的配置,如下所示:

$config

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

Zend\Config\Config

如果你真的想使用getter,那么你必须对一个对象进行配置。您可以使用$config = new \Zend\Config\Config($config, false); 类执行此操作,如下所示:

$config->get('locales');

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

*.local.php

更新

如果要从供应商模块加载自动配置文件,通常会将模块附带的*.global.php和/或var fs = require('fs'); var express = require('express'); var app = express(); var privateKey = fs.readFileSync('my_key.key', 'utf8'); var certificate = fs.readFileSync('my_cert.crt', 'utf8'); app.post('/process', function(req, res) { // do something }).listen(3000); 文件复制到自动加载文件夹并编辑复制的文件根据您的需求。

答案 1 :(得分:0)

我认为您并不完全理解您尝试实施的解决方案。您要添加到服务配置的工厂需要返回库类的实例。您将它放入工厂的原因是您可以将配置数组注入其中。所以你的代码应该更像这样:

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(),这不会有任何成就。