2012-01-11 31 views
9

我们需要访问侦听器中的数据库信息。 我们配置监听器在service.yml 监听器是这样的:在Symfony 2的侦听器中访问数据库

namespace company\MyBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class RequestListener 
{ 
    protected $container; 

public function __construct(ContainerInterface $container) 
{ 
    $this->container = $container; 
} 

public function onKernelRequest(GetResponseEvent $event) 
{ 
... 

我们怎样才能在onKernelRequest功能访问的学说?

我试图从控制器延伸,并做到:

 $em = $this->getDoctrine()->getEntityManager(); 

和它的作品,但我认为这是一个不好的做法。

+0

感谢所有的意见。所有都是很好的选择。 – Santi 2012-01-13 15:09:57

回答

27

您可以只注入服务容器。首先改变构造函数来得到一个EntityManager:

use Doctrine\ORM\EntityManager; 

class RequestListener { 
    protected $em; 
    function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 
    //... 
} 

而旁边配置您的服务:

#... 
services: 
    foo.requestlistener: 
     class: %foo.requestlistener.class% 
     arguments: 
      - @doctrine.orm.entity_manager 
+0

谢谢,是不错的选择 – Santi 2012-01-13 15:10:46

+3

这是最好的选择。 – 2013-02-05 17:08:59

+0

谢谢,一旦我添加了“使用Symfony \ Component \ DependencyInjection \ ContainerInterface;” – someuser 2013-04-13 13:16:53

2

好像你注射服务容器到监听器,这样你就可以访问主义是这样的:

$doctrine = $this->container->get('doctrine'); 
1

我是那种在Symfony的新手还是的,但你有没有试过传递doctrine服务给您的监听器而不是服务容器?

或者,您已经通过服务容器,因此它应该像调用
$this->container->get('doctrine')一样简单。另外,前段时间我在IRC被告知,通过服务容器通常被认为是不好的做法。最好传递你需要的单个服务。

+0

谢谢,是不错的选择 – Santi 2012-01-13 15:10:13

0

我不会把业务逻辑听众为只对监听事件。你会如何使用原则为听众编写测试...

我会将学习访问的东西放到不同的类中,然后在侦听器中调用它。

2

如果你的使用情况,您可以使用一个学说事件监听器directely

#services.yml 
qis.listener.contractBundleStatusListener: 
    class: Acme\AppBundle\EventListener\MyListener 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 

可以从LifecycleEventArgs获取实体管理器:

<?php 

use Doctrine\ORM\Event\LifecycleEventArgs; 

class MyListener 
{ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof Foo) { 
      $entityManager = $args->getEntityManager(); 

      $entityManager->persist($entity); 
      $entityManager->flush(); 
     } 
    } 
} 
相关问题