我们在我的工作场所使用ZendFramework来处理我们的webapps。没关系,但它缺乏一些最好的现代实践(比如依赖注入和控制反转,aop等)。
几个月来,我一直(我自己)使用Ding框架作为DI和AOP的容器作为试驾。我非常喜欢它,所以我想将它带入我们的项目中。
但是怎么样?所以有一个问题:如何在Zend Framework应用程序中正确地集成Ding?考虑到ZF控制器不能是bean(因为它们是直接从调度程序实例化的),如何在其中有属性地注入所有依赖项?P.s:不使用Zend Framework不是一种选择(至少在中期)。 P.P.S:有人想把“叮”添加为新标签吗?
答案 0 :(得分:1)
我很高兴丁正在帮助你。 我为这个项目做出了贡献,还需要与Zend Framework应用程序集成。我使用Zend的应用程序资源和插件系统来实现这一目标。
应用程序资源(您可以在项目中重复使用)
<?php
class Application_Resource_Ding extends Zend_Application_Resource_ResourceAbstract
{
protected $_options = array(
'factory' => array(
'bdef' => array(
'xml' => array(
'filename' => array('beans.xml')
),
),
),
'cache' => array(
'proxy' => array('impl' => 'dummy'),
'bdef' => array('impl' => 'dummy'),
'beans' => array('impl' => 'dummy')
)
);
public function init()
{
// set default config dir before mergin options (cant be set statically)
$this->_options['factory']['bdef']['xml']['directories'] = array(APPLICATION_PATH .'/configs');
$options = $this->getOptions();
// parse factory properties (if set)
if (isset($options['factory']['properties'])) {
$options['factory']['properties'] = parse_ini_file(
$options['factory']['properties']
);
}
// change log4php_properties for log4php.properties (if exists)
if (isset($options['log4php_properties'])) {
$options['log4php.properties'] = $options['log4php_properties'];
unset($options['log4php_properties']);
}
$properties = array(
'ding' => $options
);
return Ding\Container\Impl\ContainerImpl::getInstance($properties);
}
}
在控制器内使用的动作助手:
<?php
class Application_Action_Helper_Ding extends Zend_Controller_Action_Helper_Abstract
{
protected $ding = null;
public function init()
{
// just once...
if (null !== $this->ding) {
return;
}
// get ding bootstrapped resource
$bootstrap = $this->getActionController()->getInvokeArg('bootstrap');
$ding = $bootstrap->getResource('ding');
if (!$ding) {
throw new Zend_Controller_Action_Exception(
'Ding resource not bootstrapped'
);
}
$this->ding = $ding;
}
public function getBean($bean)
{
return $this->ding->getBean($bean);
}
public function direct($bean)
{
return $this->getBean($bean);
}
}
在你的application.ini
中,你应该添加这样的内容(加上你需要的任何额外配置)
resources.frontController.actionHelperPaths.Application_Action_Helper = "Application/Action/Helper"
resources.ding.factory.properties = APPLICATION_PATH "/configs/ding.properties"
resources.ding.log4php_properties = APPLICATION_PATH "/configs/log4php.properties"
然后在你的控制器中,请求一个bean:
$service = $this->_helper->ding('someService');
希望这有帮助!