我有一个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 - 这在另一个控制器中效果很好,其中唯一被水合的对象是父对象。它在对象被水合作为对象图的一部分的控制器中失败。
答案 0 :(得分:1)
您可能正在尝试访问postLoad事件中的关联。
请注意,postLoad事件发生在任何实体之前 协会已经初始化。因此访问是不安全的 postLoad回调或事件处理程序中的关联。
答案 1 :(得分:0)
请注意将来发现此问题的任何人。有一个解决方法。它不漂亮,但它似乎工作。您可以在http://www.doctrine-project.org/jira/browse/DDC-1010
了解更多信息该票证还指出了两个解决这个问题的承诺代码 - https://github.com/doctrine/doctrine2/commit/8d13601e39d0fdefdd1d2c0a85704c440b8bdd37,所以希望很快能有更好的解决方案。