1

我有一个 postLoad 事件侦听器,它执行查询以检索一些文件数据,这些文件数据被弹出到正在加载的实体的数组中。我这样做是因为我们有许多不同的项目需要添加到实体中,但对于实体来说不是必不可少的。现在它是文件,但我们最终将拥有至少 7 个这样的“项目”。我们决定在 Symfony 中将它们实现为服务,将它们提供的“有效负载”放入 infoArray,而不是创建 7 个不同的映射到单个“项目”。现在,当我们想添加一个新的“项目”时,我们不必编辑数十个业务对象来添加新的映射,我们只需将它添加到 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 - 这在另一个控制器中效果很好,其中唯一被水合的对象是父对象。它在对象作为对象图的一部分被水合的控制器中失败。

4

2 回答 2

1

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

文档中:

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

于 2013-10-08T21:19:31.120 回答
0

只是为将来发现此问题的任何人提供的说明。有一种解决方法。它不漂亮,但它似乎工作。您可以在http://www.doctrine-project.org/jira/browse/DDC-1010阅读更多内容

该票还指出了解决此问题的两个原则中的已提交代码 - https://github.com/doctrine/doctrine2/commit/8d13601e39d0fdefdd1d2c0a85704c440b8bdd37,因此希望很快会有更好的解决方案。

于 2013-10-09T01:07:06.780 回答