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中实现类似的功能?
谢谢
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可以帮助你.