Dependencies Ancesor对象中的ZF2依赖项注入

Dependencies Ancesor对象中的ZF2依赖项注入,dependencies,code-injection,zend-framework2,Dependencies,Code Injection,Zend Framework2,我的目标是使用setter在祖先对象中使用DI,因此我有一个用于祖先对象的公共DI。e、 g.我的其他模型继承的抽象模型类,预先配置了实体管理器等 到目前为止,在配置祖先并使用DI成功创建它之后,将其更改为抽象类,然后实例化该类的祖先,抽象的DI(无论是否设置为抽象)不会运行 名称空间Stuki use Doctrine\ORM\EntityManager; # abstract class Model { protected $em; public function se

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

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


名称空间Stuki

use Doctrine\ORM\EntityManager;

# abstract
class Model {
    protected $em;

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

这个类的DI


'di'=>数组(

上面的类和DI可以工作,但我希望它能在祖先对象上运行,所以


名称空间Stuki\Model

use Stuki\Model as StukiModel;

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

$auth = $e->getTarget()->getLocator()->get('Stuki\Model\Authentication');

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


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

很抱歉,当我通过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仍然需要使用内省来发现诸如实例化器、方法和方法参数之类的东西。避免运行时自省的唯一方法是预编译:。

从条令实体的角度来看,实体不应该是entitymanager感知的。我猜你是在用SpiffyDoctrineORM来支持zf2条令?
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);