我有一个与教义、可记录(DoctrineExtension)和听众有关的非常奇怪的案例。
我将解释我在这里遇到的情况,下面是我认为与问题相关的所有代码。
我有两个实体(协议和模板),其中协议基于特定的模板版本。模板实体具有 DoctrineExtension Loggable 注释。因此,我可以使用 LogEntryRepository->revert() 方法将协议模板恢复为特定版本。(我正在使用 postLoad 侦听器来执行此操作,因此每次检索协议时,都会为该协议加载正确的模板版本)。
如果我得到一个控制器操作,其中使用 ParamConververter 注释检索协议,则一切正常,并且使用正确的模板检索我的协议。如果我尝试使用查询生成器在控制器操作的第一行中检索相同的协议,则会收到以下异常
Notice: Trying to get property of non-object in /home/administrator{dir}/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 481
任何帮助,将不胜感激。谢谢。
只需复制与问题相关的部分:
实体
/**
* Agreement
*
* @ORM\Table(name="agreement")
* @ORM\Entity
* @Gedmo\Loggable
*/
class Agreement
{
/**
* @var integer
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
* @ORM\Column(name="template_version", type="bigint", nullable=false)
* @Gedmo\Versioned
*/
private $templateVersion;
/**
* @var \Template
* @ORM\ManyToOne(targetEntity="Template")
* @ORM\JoinColumn(name="template_id", referencedColumnName="id")
*/
private $template;
}
/*
* Template
*
* @ORM\Table(name="template")
* @ORM\Entity
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
* @Gedmo\Loggable
*/
class Template
{
/**
* @var integer
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=255, nullable=false)
* @Gedmo\Versioned
*/
private $name;
}
教义订阅者
*(services.yml)*
services:
ourdeal.listener.loggable:
class: App\Bundle\Listener\LoggableSubscriber
tags:
- { name: doctrine.event_subscriber }
class LoggableSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
'prePersist',
'postLoad',
);
}
public function prePersist(LifecycleEventArgs $args)
*...Code omitted...*
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$entityManager = $args->getEntityManager();
if ($entity instanceof Agreement)
{
$agreement = $entity;
$repo = $entityManager->getRepository('Gedmo\Loggable\Entity\LogEntry');
$repo->revert($agreement->getTemplate(), $agreement->getTemplateVersion());
}
}
}
行动
通过此操作,我可以毫无问题地获得所需的协议。
/**
* @Route("/agreement/send/{id}", name="agreement/send")
* @ParamConverter("agreement", class="Bundle:Agreement")
* @Template()
*/
public function sendAction(Request $request, Agreement $agreement) {
*...Code omitted...*
}
使用此代码,我得到了异常(硬编码的 id 和此代码仅用于测试)
/**
* @Route("/agreement/send", name="agreement/send")
* @Template()
*/
public function sendAction(Request $request) {
$em = $this->get('doctrine')->getManager();
$qb = $em->createQueryBuilder()->select('a')->from('AppBundle:Agreement', 'a')->where('a.id=1378');
$agreements = $qb->getQuery()->getResult();
}