我的目标是使用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?
答案 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。