2013-10-08 48 views
1

我有一个postLoad事件侦听器,它执行查询来检索某些文件数据,该数据弹出到正在加载的实体的数组中。我这样做是因为我们有许多不同的项目需要添加到实体中,但不是实体必需的。现在它是文件,但我们最终将至少有7个这样的“项目”。我们决定将它们作为Symfony中的服务来实现,而不是将它们提供到infoArray中的“有效载荷”删除。现在,当我们想添加一个新的“项目”时,我们不必编辑数十个业务对象来添加一个新的映射,我们可以将它添加到infoArrray(由服务名称键入),任何需要它的人都可以从它该数组。ResultSetManager在postLoad事件处理程序后发生了破坏

所以我的实体看起来像

/** 
    * @var integer $id 
    * 
    * @ORM\Column(name="ID", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    * @Type("integer") 
    * @SerGroups({"modulerevision", "module_revision"}) 
    */ 
    protected $id; 
    . 
    . 
    . 
    public $servicesArray; 

在事件监听器我最终调用下面的方法

public function getFiles(ConsumerInterface $entity, $fullPath = false){ 
     $query = $this->em->createQuery(
      'SELECT f 
      FROM FileManagerBundle:File f 
      JOIN f.owners o 
      WHERE o.id = ?1'); 
     $query->setParameter(1, $entity->getOwner()); 
     $files = $query->getResult(); 
     return $files;  
    } 

这个伟大的工程。查询被执行,我得到我的数组文件,并将其推到我的实体中的$ infoArray。

运行负荷后事件代码后,我们把线480

if ($this->_rsm->isMixed) { 

跳回教义\ ORM \内部\水化\ ObjectHydrator此时私人varialble _rsm不再设置和房子来轰然倒下以下情况例外

Notice: Trying to get property of non-object in /var/www/symfony/xesapps/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 480 

是否有可能在餐后事件被杀害ResultSetManager被用来滋润对象时调用额外查询加载?如果是这样,有没有办法解决这个问题?我需要以不同的方式来解决这个问题吗?

PS - 这个工程在另一个控制器中很好,在这个控制器中,唯一被水化的对象是父对象。它在对象被水合作为对象图的一部分的控制器中失败。

回答

1

您可能正尝试访问postLoad事件中的关联。

documentation

注意,任何 协会一直在初始化之前的餐后事件发生时一个实体。因此,在postLoad回调或事件处理程序中访问 关联是不安全的。

+0

这很有道理。我现在看到我正在访问一个关联,甚至认为它是通过一个接口。它为什么会在一种情况下工作,而不是在另一种情况下工作?就像解析dql的方式以及实体在对象图中的位置? – Quint

+0

其实我并没有深入这个主题的内部,但我想起了一些类似的问题让我疯狂在过去:) – nifr

相关问题