0

我有一个与教义、可记录(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();
    }
4

2 回答 2

0

利用setParameter()

$em->createQueryBuilder()
    ->select('a')
    ->from('AppBundle:Agreement', 'a')
    ->where('a.id = :id')
    ->setParameter('id', $request->get('id'));
于 2013-06-26T08:58:12.317 回答
0

有一个已知的错误 #52083 会影响 5.3.4 之前的 PHP 版本,它会随机失败并显示“注意:尝试获取非对象的属性”。

如果是这种情况,请尝试升级 PHP 将解决您的问题。希望有帮助

于 2013-08-27T07:01:28.547 回答