我有一个非常奇怪的案例,涉及到教义、争论(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());
}
}
}Actions
有了这个行动,我就能毫无问题地达成期望的协议。
/**
* @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();
}发布于 2013-06-26 08:58:12
使用setParameter()
$em->createQueryBuilder()
->select('a')
->from('AppBundle:Agreement', 'a')
->where('a.id = :id')
->setParameter('id', $request->get('id'));发布于 2013-08-27 07:01:28
有一个已知的bug #52083会影响5.3.4之前的PHP,它会随机失败,“注意:试图获取非对象的属性”。
如果是这样的话,尝试升级PHP将解决您的问题。希望这有帮助
https://stackoverflow.com/questions/17315570
复制相似问题