如何在Symfony2中的内核侦听器中访问容器?

时间:2014-04-17 10:33:49

标签: symfony service kernel listener before-filter

我尝试实现一个之前的内核监听器(see reference),我只需设置一些参数值(我必须动态获取,不能在我的parameters.yml文件中静态声明)。

这是我的听众课程:

class AcmeListener
{
    public function onKernelController(FilterControllerEvent $event)
    {
        $event->getController()->getContainer()->setParameter('foo', 'bar');
    }
}

在我的config.yml

services:
    kernel.listener.acme_listener:
        class: Acme\AcmeBundle\EventListener\AcmeListener
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

但我得到了

  

FatalErrorException:错误:在非对象上调用成员函数getContainer()

如果不是通过getContainer()中的$event->getController()来访问容器?

1 个答案:

答案 0 :(得分:1)

只需将容器作为参数添加到服务定义中。

services:
    kernel.listener.acme_listener:
        class: Acme\AcmeBundle\EventListener\AcmeListener
        arguments:
            - @service_container
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

然后在AcmeListener类中添加一个构造函数,以便您可以访问它。

use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

class AcmeListener
{
    /**
     * @var Container
     */
    private $container;

    /**
     * Constructor
     *
     * @param Container $container
     */
    public function __construct(Container $container)
    {
            $this->container = $container;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
            $this->container->...
    }
}