ResultSetManager在postLoad事件处理程序之后被破坏了

时间:2013-10-08 17:52:55

标签: symfony doctrine-orm doctrine

我有一个postLoad事件监听器,它执行查询以检索弹出到正在加载的实体的数组中的某些文件数据。我这样做是因为我们有许多不同的项目需要添加到实体,但对实体来说并不重要。现在它是文件,但我们最终将至少有7个“项目”。我们决定将它们作为Symfony中的服务实现,而不是为单个“项目”创建7个不同的映射,而是将它们提供的“有效负载”丢弃到infoArray中。现在,当我们想要添加一个新的“项目”时,我们不必编辑几十个业务对象来添加新的映射,我们可以将它添加到infoArrray(由服务名称键入),无论谁需要它都可以从那个阵列。

所以我的实体看起来像

/**
  * @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。

运行postLoad事件代码后,我们将跳回到第480行的Doctrine \ ORM \ Internal \ Hydration \ ObjectHydrator

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

此时私人变量_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 

在postLoad事件期间调用附加查询是否可能会杀死用于水合正在加载的对象的ResultSetManager?如果是这样,有什么方法吗?我是否需要以不同的方式解决这个问题?

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

2 个答案:

答案 0 :(得分:1)

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

来自documentation

  

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

答案 1 :(得分:0)

请注意将来发现此问题的任何人。有一个解决方法。它不漂亮,但它似乎工作。您可以在http://www.doctrine-project.org/jira/browse/DDC-1010

了解更多信息

该票证还指出了两个解决这个问题的承诺代码 - https://github.com/doctrine/doctrine2/commit/8d13601e39d0fdefdd1d2c0a85704c440b8bdd37,所以希望很快能有更好的解决方案。