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

如何在Symfony2中访问before内核侦听器中的容器?,symfony,service,kernel,listener,before-filter,Symfony,Service,Kernel,Listener,Before Filter,我尝试实现一个before-kernel listener(),在这里我只需设置一些参数值(必须动态获取,不能在parameters.yml文件中静态声明) 这是我的侦听器类: class AcmeListener { public function onKernelController(FilterControllerEvent $event) { $event->getController()->getContainer()->setPara

我尝试实现一个before-kernel listener(),在这里我只需设置一些参数值(必须动态获取,不能在
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()


如果不是通过
$event->getController()
通过
$event->getController()
访问容器,我如何访问容器?

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

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->...
    }
}

看起来很有希望,但我得到了一个
逻辑异常:无法对冻结的参数包调用set()。
我是否必须切换到
onKernelRequest
而不是
onKernelController
?可能。回顾我做这件事的时候,我使用了onKernelRequest。那还适合你的需要吗?我现在明白你的问题了。文档提供了一些信息:“您只能在编译容器之前设置参数。要了解有关编译容器的更多信息,请参阅编译容器。”您应该接受@Mark的回答,因为它显示了如何访问容器。虽然我个人会实现ContainerWare接口,而不是将容器注入构造函数。但他的解决方案奏效了。完全更新冻结的参数包是另一个问题,基本上是不可能的。您需要使用语义配置来完成这类工作。