symfony2 doctrine2 postLoad和单表继承

时间:2013-01-26 08:19:51

标签: symfony doctrine-orm

我有一个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对动物实体的继承属性一无所知。 我究竟做错了什么?有人知道吗?

非常感谢。

1 个答案:

答案 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,否则无法直接读取它们。如果您需要任何澄清,请告诉我,但这种带元数据的方法对我来说很好。它还为您提供了关联