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

Jak*_*ake 2 php zend-framework2

嗨,

在Zend Framwork 1中,我曾经有过一个application\configs\appsettings.xml用于存储params和值的函数,例如Rest API URL的主机名,调试设置以及dev,test和prod环境的其他应用程序特定设置.我可以在所有控制器和模型中使用此注册表,并在index.php中创建

   $applicationEnvironment = 'development';
   $config = new Zend_Config_Xml( APPLICATION_PATH . '/configs/appsettings.xml',
                                  $applicationEnvironment, true );
    Zend_Registry::set( 'config', $config );
Run Code Online (Sandbox Code Playgroud)

我如何在Zend Framework 2中实现类似的功能?

谢谢

Bra*_*sen 7

Registry在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;
                },
            ),
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

为简单起见,上面的工厂被定义为封闭,但我建议创建一个单独的工厂类.有许多资源可以解释如何做到这一点.

在这个例子中,我们注入了完整的配置,但根据您的使用情况,通常最好只注入您需要的配置密钥.

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