与zend框架集成

时间:2011-07-28 22:57:43

标签: php zend-framework dependency-injection ioc-container

我们在我的工作场所使用ZendFramework来处理我们的webapps。没关系,但它缺乏一些最好的现代实践(比如依赖注入和控制反转,aop等)。

几个月来,我一直(我自己)使用Ding框架作为DI和AOP的容器作为试驾。我非常喜欢它,所以我想将它带入我们的项目中。

但是怎么样?所以有一个问题:如何在Zend Framework应用程序中正确地集成Ding?考虑到ZF控制器不能是bean(因为它们是直接从调度程序实例化的),如何在其中有属性地注入所有依赖项?

P.s:不使用Zend Framework不是一种选择(至少在中期)。 P.P.S:有人想把“叮”添加为新标签吗?

1 个答案:

答案 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');

希望这有帮助!