我有一个 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 - 这在另一个控制器中效果很好,其中唯一被水合的对象是父对象。它在对象作为对象图的一部分被水合的控制器中失败。