在Symfony 2中访问侦听器中的数据库

时间:2012-01-11 17:12:34

标签: symfony doctrine-orm listener bundle

我们需要在侦听器中访问数据库信息。 我们在service.yml中配置监听器 听众就像:

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函数中访问doctrine?

我试图从控制器扩展并执行:

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

它有效,但我认为这是一种不好的做法。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

看起来你正在将服务容器注入到监听器中,所以你可以这样访问Doctrine:

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

答案 2 :(得分:2)

如果您的用例允许您直接使用Doctrine事件监听器

#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();
        }
    }
}

答案 3 :(得分:1)

我仍然是Symfony的新手,但您是否尝试将doctrine服务传递给您的侦听器而不是服务容器?

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

答案 4 :(得分:0)

我不会将业务逻辑放在监听器上,因为它只用于监听事件。你将如何使用doctrine为听众编写测试...

我将学习访问的东西放到另一个类中,然后在监听器中调用它。

答案 5 :(得分:0)

在symfony 4中,您应该像这样使用依赖注入

{
"latlngs":
    [[2.367272,48.662474],[2.36523,48.663373],
    [2.360465,48.66607],[2.3557,48.667419],
    [2.352978,48.667868],[2.348893,48.669217],
    [2.34549,48.671015],[2.342767,48.672813]...]
}