我有一个Doctrine 2 Single Table Inheritance的实体结构,如下所示:
/**
*
* @ORM\Table(name="animal")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="animaltype", type="integer")
* @ORM\DiscriminatorMap({1 = "Cat", 2 = "Dog"})
*/
class Animal
.
.
.
这是继承的实体:
/**
* @ORM\Entity
*/
class Dog extends Animal
现在我想用postload Event:
对象做一些事情我从LifecycleEventArgs对象中获取Dog对象,但只使用Dog Entity的属性,此时Listener对动物实体的继承属性一无所知。 我究竟做错了什么?有人知道吗?
非常感谢。
答案 0 :(得分:1)
属性在您的Animal类中是私有的。我刚刚做了类似的事情,但您需要使用元数据来获取postLoad
方法中的对象属性。
$MetaData = $em->getClassMetadata(get_class($entity));
然后,您可以使用
获取所有字段名称(格式正确,不带“_”)foreach (array_keys($MetaData->reflFields) as $value) {
}
为了使用这些字段的getter,你可以这样做:
//this will become $entity->getSomeFieldValue()
//it will eval to false if this doesn't exist
if ($entity->{'get' . ucfirst($value)}()) {}
您的整个代码看起来像:
//Your listener class
private $reg;
public function __construct(Registry $reg) {
$this->reg = $reg;
}
public function postLoad( LifecycleEventArgs $eventArgs ){
$entity = $eventArgs->getEntity();
$em = $this->reg->getManager();
$MetaData = $em->getClassMetadata(get_class($entity ));
foreach (array_keys($MetaData->reflFields) as $value) {
if ($entity->{'get' . ucfirst($value)}()) {
//here you can get the $entity->someGetter() values
}
}
}
在你的service.yml中你会这样做:
arguments: ['@doctrine']
tags:
- { name: doctrine.event_listener, event: postLoad }
请记住,除非您将父类变量切换为protected
而不是private
,否则无法直接读取它们。如果您需要任何澄清,请告诉我,但这种带元数据的方法对我来说很好。它还为您提供了关联