在Symfony 2.4 Entity Listener中获取Doctrine

时间:2014-05-04 20:01:05

标签: php symfony doctrine-orm doctrine

我正在使用新的Entity Listeners,它们对触发它们的实体非常有用。但是,在Listener中我想访问其他实体的数据,实质​​上是要发出一些数据库请求。

要执行此操作,我使用的是setter injection

<?php 

// Project/DefaultBundle/EventListener/SomeIndexer.php

namespace Project\DefaultBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Project\DefaultBundle\Entity\Document;
use Doctrine\ORM\EntityManager;

class SomeIndexer
{

    protected $em;

    public function setEntityManager(EntityManager $em)
    {
        $this->em = $em;
    }

    public function prePersist(Document $doc, LifecycleEventArgs $args)
    {
        // this is my Document entity which works fine
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        if ( $entity instanceof Document )
        {
            // em doesn't seem to be an object
            $this->em->getRepository('ProjectDefaultBundle:SomeOtherEntity') ...
        }
    }

}

并在我的服务配置

// Project/DefaultBundle/Resources/config/services.yml

services:
    timeline.eventlistener.tripindexer:
        class: Project\DefaultBundle\EventListener\SomeIndexer
        calls:
        - [setEntityManager, ["@doctrine.orm.entity_manager"]]

1 个答案:

答案 0 :(得分:0)

我有一个错误的假设,即$entityManager仅适用于文档实体。事实上,您不需要注入任何东西,只需使用:

$repository = $entityManager->getRepository('ProjectDefaultBundle:SomeOtherEntity')...

通过How to get foreign repository inside my repository in Doctrine2/Symfony2?