我尝试实现一个之前的内核监听器(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()
来访问容器?
答案 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->...
}
}