Ancers对象中的ZF2依赖注入

时间:2012-01-06 20:11:36

标签: dependencies code-injection zend-framework2

我的目标是使用setter在祖先对象中使用DI,因此我有一个用于祖先对象的公共DI。例如我的其他模型继承自的抽象模型类,预先配置了实体管理器等。

到目前为止,在配置祖先并使用DI成功创建它之后,将其更改为抽象类,然后实例化该类的祖先,抽象的DI(无论是否设置为抽象)不会运行。 / p>

namespace Stuki;

use Doctrine\ORM\EntityManager;

# abstract
class Model {
    protected $em;

    public function setEm(EntityManager $em) {
        $this->em = $em;
    }
}

use Doctrine\ORM\EntityManager; # abstract class Model { protected $em; public function setEm(EntityManager $em) { $this->em = $em; } }

此课程的DI

'di' => array(

    'instance' => array(

        'Stuki\Model' => array(
            'parameters' => array(
                'em' => 'doctrine_em'
            )        
        ),

上述课程和DI将有效。但是我想要在祖先对象上运行

'instance' => array( 'Stuki\Model' => array( 'parameters' => array( 'em' => 'doctrine_em' ) ),

namespace Stuki\Model;

最后一行$ auth =不运行DI。

如何在不使用内省的情况下为祖先对象设置DI?

1 个答案:

答案 0 :(得分:0)

抱歉,当我通过Meetup回复时,我的假设是不正确的;)

问题的关键在于您正在配置Stuki \ Model以在InstanceManager中获取EntityManager,但要求Di进行Stuki \ Authentication。

你可以切换到构造函数注入...这可以工作,但我真的不想在祖先类中定义构造函数:

class EntityManager {

}

# abstract
abstract class Model {
    protected $em;

    public function __construct(EntityManager $em) {
        $this->em = $em;
    }
}

class Authentication extends Model {
    public function getIdentity() {
        return 'ħ'; #die('get identity');
    }
}

$di = new Zend\Di\Di();
$im = new Zend\Di\InstanceManager();
$di->setInstanceManager($im);
$auth = $di->get('Authentication');
var_dump($auth);

有一点需要注意,在我们的两个例子中,Di仍然需要使用内省来发现诸如实例化器,方法和方法参数之类的东西。在运行时避免内省的唯一方法是预编译:http://packages.zendframework.com/docs/latest/manual/en/zend.di.definition.html#zend.di.definition.compilerdefinition