【问题标题】:Get global config in Zend Framework 2在 Zend Framework 2 中获取全局配置
【发布时间】:2015-09-16 08:49:58
【问题描述】:

有人问了我的问题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-&gt;getServiceConfig()-&gt;get('locales'); 我得到

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

【问题讨论】:

  • 但是您需要的解释在错误描述中... $this->getServiceConfig() 返回一个数组,所以稍后您尝试调用 Array->get();当然 Array 不是对象,你不能调用 ->get() 方法......或者我不明白一个问题?试试 $config = $this->getServiceConfig(); $config['locales'];
  • 这就是问题所在。我得到数组,但里面没有配置变量。

标签: php zend-framework2 config service-locator


【解决方案1】:

假设您有一个语言环境配置文件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 中的以下行加载它们。有关此高级配置的详细信息,您可以阅读here in the ZF2 documentation

'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 文件复制到自动加载文件夹并根据需要编辑复制的文件.

【讨论】:

  • 感谢您的回复。我正在使用描述的工作流程。在应用程序模块(如/module/Customers/src/Customers/Controller/CustomersController.php)中它工作正常。我可以通过$config = $this-&gt;getServiceLocator()-&gt;get('Config'); 访问配置变量但是当类位于\vendordirectory 中时这不起作用:Fatal error: Call to a member function get() on a non-object in [...]/vendor/Tools/src/Tools/Model/StandartFuncs.php
  • @user2047861 供应商目录中有什么类?我不建议将您的自定义类和模块放在供应商文件夹中。
  • 我将自定义类命名为 class StandartFuncs。它位于/vendor/Tools/src/Tools/Model/StandartFuncs.php。而且我还需要访问vendor/zendframework/zendframework/library/Zend/Authentication/Adapter/DbTable/CredentialTreatmentAdapter.php 中的全局配置变量。我想在 authenticateCreateSelect() 中从另一个数据库中进行选择,该数据库的名称是在全局配置中设置的。但在那里我面临同样的问题。
【解决方案2】:

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

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');
}

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

【讨论】:

  • 感谢您的回复。在应用程序控制器中,我通过new \Tools\Model\StandartFuncs; 访问我的库。所以在类函数getServiceConfig() 中,我将你的return new \SomeLibrary($config) 替换为return new \Tools\Model\StandartFuncs。现在在该类public function save() 中声明$this-&gt;getServiceLocator()-&gt;get('funcservice'); 产生Fatal error: Call to a member function get() on a non-object
  • “在那个类 xxx 里面产生 ”——在什么类里面?我的回答中的示例向您展示了如何从控制器获取库类的实例。你想从哪个类调用它?
  • 我的自定义类位于/vendor/Tools/src/Tools/Model/StandartFuncs.php。我将其命名为 StandartFuncs。现在它也有public function getServiceConfig()。我在/module 控制器中使用这个类作为$funcs = new \Tools\Model\StandartFuncs;。在我需要全局配置变量之前它工作正常。
  • 就像我说的,您需要使用服务管理器来实例化您的类,以便 ZF 可以将配置注入其中。 $funcs = $this-&gt;getServiceLocator()-&gt;get('funcservice'); 而不是 $funcs = new \Tools\Model\StandartFuncs; 也是如此。我不知道为什么你的课堂上有一个获取服务配置功能 - 这可能不应该存在。
猜你喜欢
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多