Php 如何在Zend Framework 2中编写和使用配置文件

Php 如何在Zend Framework 2中编写和使用配置文件,php,zend-framework2,Php,Zend Framework2,嗨 在Zend Framwork 1中,我曾经有一个应用程序\configs\appsettings.xml,在这里我用来存储参数和值,如Rest API URL的主机名、调试设置以及开发、测试和产品环境的其他特定于应用程序的设置。该注册表可用于所有控制器和模型,并在index.php中创建 $applicationEnvironment = 'development'; $config = new Zend_Config_Xml( APPLICATION_PATH . '/conf

在Zend Framwork 1中,我曾经有一个
应用程序\configs\appsettings.xml
,在这里我用来存储参数和值,如Rest API URL的主机名、调试设置以及开发、测试和产品环境的其他特定于应用程序的设置。该注册表可用于所有控制器和模型,并在index.php中创建

   $applicationEnvironment = 'development';
   $config = new Zend_Config_Xml( APPLICATION_PATH . '/configs/appsettings.xml',
                                  $applicationEnvironment, true );
    Zend_Registry::set( 'config', $config );
如何在Zend Framework 2中实现类似的功能


谢谢

在ZF2中没有
注册表
,因为它是一种反模式。这只是对全局变量的一种奇特的替代,它会在应用程序中产生各种不必要的副作用

在ZF2中,您有serviceManager,这允许将所有依赖项干净地注入控制器/模型/服务。config/autoload目录中的所有配置文件由ZF2自动合并到一个数组中,您可以使用
$serviceLocator->get('config')
从服务管理器中检索此文件。每当需要在控制器中使用配置时,只需创建serviceFactory并注入配置

class FooController
{
    protected $config;

    public __construct($config)
    {
        $this->config = $config;
    }

    public barAction()
    {
        //use $this->config
    }
}

class Module
{
    public function getControllerConfig()
    {
        return array(
            'factories' => array(
                'fooController' => function(ControllerManager $cm) 
                {
                    $sm   = $cm->getServiceLocator();
                    $config = $sm->get('Config');
                    $controller = new FooController($config);
                    return $controller;
                },
            ),
        );
    }
}
为了简单起见,上面的工厂定义为闭包,但我建议创建一个单独的工厂类。有很多资源可以解释如何做到这一点

在本例中,我们将注入完整的配置,但根据您的用例,通常最好只注入您需要的配置键


或者,您可以将某些配置值包装到具有显式getter和setter的专用配置对象中,并将其注入控制器
Zend\StdLib\AbstractOptions
可以帮助您。

如果您希望使用配置文件,但无法访问服务管理器或希望向其写入内容,可以使用Zend\config

要阅读,您可以执行以下操作:

$config = new Config(include 'config/autoload/my_amazing_config.global.php');
$details = $config->get('array_key')->get(sub_key)->toArray();
要写信给,您可以执行以下操作:

// Create the config object
$config = new Zend\Config\Config(array(), true);
$config->production = array();

$config->production->webhost = 'www.example.com';
$config->production->database = array();
$config->production->database->params = array();
$config->production->database->params->host = 'localhost';
$config->production->database->params->username = 'production';
$config->production->database->params->password = 'secret';
$config->production->database->params->dbname = 'dbproduction';

$writer = new Zend\Config\Writer\Xml();
echo $writer->toString($config);
该类支持ini、xml、phpArray、json、yaml

您可以在以下网址阅读更多内容:

您展示的工厂似乎只适用于“fooController”。但我发现我的应用程序中的许多模块和控制器可能需要使用配置阵列中的设置。有没有一种方法可以概括这一点?您可以在控制器中实现接口
ServiceLocatorAwareInterface
,该接口将触发servicemanager在实例化时自动注入servicelocator(称为初始化器)。您甚至可以编写自己的初始值设定项来注入配置。看见我倾向于避免使用初始值设定项,尽量做到显式,因为它们在幕后发挥了很大的作用,使调试变得更加困难。我认为控制器插件非常适合这种情况(如果需要的只是控制器内部)。创建一个,注入配置,并有一个很好的API来访问配置数据;很像现在的@AlexP。控制器插件也是一个好主意。这只会使您的代码更难测试。@BramGerritsen。谢谢你的链接。我能够完成,现在能够在实现configawareinterface的控制器中获得所需的配置。但是,如果我需要模型文件中的配置键,我需要做什么呢?太棒了。非常感谢。我可以在模型文件中这样做。它将写入哪个文件?到我的_supervise_config.global.php?