Php 在Zend Framework 2中获取全局配置

Php 在Zend Framework 2中获取全局配置,php,zend-framework2,config,service-locator,Php,Zend Framework2,Config,Service Locator,有人问我的问题。我还想访问位于我的个人库(供应商目录)中的全局配置(config/{,*.}{global,local}.php)。我认为我找到的最接近的答案是。我在我的类中创建了函数 public function getServiceConfig() { return array( 'factories' => array( 'funcservice' => function(\Zend\ServiceManager\Servic

有人问我的问题。我还想访问位于我的个人库(供应商目录)中的全局配置(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>
                    )

            )

    )
)
数组
(
[工厂]=>阵列
(
[funcservice]=>闭包对象
(
[此]=>Tools\Model\StandartFuncs对象
(
[eventIdentifier:protected]=>Zend\Mvc\Controller\AbstractActionController
[插件:受保护]=>
[请求:受保护]=>
[响应:受保护]=>
[事件:受保护]=>
[事件:受保护]=>
[serviceLocator:受保护]=>
)
[参数]=>数组
(
[$sm]=>
)
)
)
)
$config=$this->getServiceConfig()->get('locales')我明白了

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


我认为您还不太了解您试图实施的解决方案。要添加到服务配置的工厂需要返回库类的实例。将其放入工厂的原因是,可以将配置数组注入工厂。因此,您的代码应该更像这样:

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

                return new \SomeLibrary($config);
            }
        )
    );
}
$config = $serviceManager->get('Config');
$config = new \Zend\Config\Config($config, false);
(其中
SomeLibrary
/vendor
中库类的名称)

然后,无论何时需要访问库类,您都需要使用服务管理器来实例化库类,例如在控制器中:

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

这将创建库类的实例,将配置数组作为构造函数传递给第一个参数。您不需要自己调用
getServiceConfig()
,这不会有任何效果。

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

<?php

return array(
    'hostname' => 'http://apachehost'
);
然后使用
application.config.php
中的以下行加载它们。您可以阅读有关此高级配置的详细信息

现在,您可以从
ServiceManager
实例访问配置,如下所示:

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

                return new \SomeLibrary($config);
            }
        )
    );
}
$config = $serviceManager->get('Config');
$config = new \Zend\Config\Config($config, false);
$config
变量是一个数组。因此,您无法使用getter访问任何内容。您应该使用数组表示法:

$locales = $config['locales'];
如果您真的想使用getter,那么您必须对对象进行配置。您可以使用
Zend\Config\Config
类这样做:

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

                return new \SomeLibrary($config);
            }
        )
    );
}
$config = $serviceManager->get('Config');
$config = new \Zend\Config\Config($config, false);
现在,您可以访问您在问题中所写的内容:

$config->get('locales');
更新
如果要从供应商模块加载自动配置文件,通常做法是将模块附带的
*.local.php
和/或
*.global.php
文件复制到自动加载文件夹中,并根据需要编辑复制的文件

但你们需要的解释是错误的描述$这个->getServiceConfig()返回一个数组,所以稍后您尝试调用Array->get();当然,数组不是对象,您不能调用->get()方法。。。还是我一个问题都不懂?尝试$config=$this->getServiceConfig()$配置['locales'];这就是问题所在。我得到了数组,但里面没有配置变量。谢谢你的回复。在应用程序控制器中,我通过
new\Tools\Model\StandartFuncs访问我的库。因此,在类函数
getServiceConfig()
中,我将您的
returnnew\SomeLibrary($config)
替换为
returnnew\Tools\Model\StandartFuncs
。现在语句
$this->getServiceLocator()->get('funcservice')该类内部
公共函数save()
产生
致命错误:对非对象调用成员函数get()
“该类内部xxx产生”-在哪个类内部?我的回答中的示例向您展示了如何从控制器获取库类的实例。您试图从哪个类调用它?我的自定义类位于
/vendor/Tools/src/Tools/Model/StandartFuncs.php
中。我把它命名为StandartFuncs。现在它还有
公共函数getServiceConfig()
。我在
/module
控制器中使用此类作为
$funcs=new\Tools\Model\StandartFuncs。在我需要全局配置变量之前,它可以正常工作。正如我所说,您需要使用服务管理器来实例化您的类,以便ZF可以将配置注入其中。因此,请执行以下操作:
$funcs=$this->getServiceLocator()->get('funcservice')
而不是
$funcs=new\Tools\Model\StandartFuncs。我不知道为什么你的类中有一个get-service-config函数——这可能不应该存在。谢谢你的回复。我正在使用描述的工作流。在应用程序模块(如
/module/Customers/src/Customers/Controller/CustomersController.php
)中,它运行良好。我可以通过
$config=$this->getServiceLocator()->get('config')访问配置变量
但是,当类位于
\vendor
目录中时,这不起作用:
致命错误:调用[…]/vendor/Tools/src/Tools/Model/StandartFuncs.php中非对象的成员函数get()
@user2047861 vendor目录中有什么类?我不建议将自定义类和模块放在供应商文件夹中。我将自定义类命名为
class StandartFuncs
。它位于
/vendor/Tools/src/Tools/Model/StandartFuncs.php
中。我还需要访问
vendor/zendframework/zendframework/library/Zend/Authentication/Adapter/DbTable/CredentialTreatmentAdapter.php
中的全局配置变量。我想从authenticateCreateSelect()中的另一个数据库中进行选择,该数据库的名称在全局配置中设置。但在那里,我面临着同样的问题。