如何在Symfony2中访问before内核侦听器中的容器?
我尝试实现一个before-kernel listener(),在这里我只需设置一些参数值(必须动态获取,不能在如何在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
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接口,而不是将容器注入构造函数。但他的解决方案奏效了。完全更新冻结的参数包是另一个问题,基本上是不可能的。您需要使用语义配置来完成这类工作。