过滤器之前和之后的Symfony2不适用于容器

时间:2014-05-09 11:50:59

标签: php symfony

我有多语言网站,它使用xml作为不同语言。 (我知道Symfony Translations存在,但是我实现了我自己的系统来访问和获取xml元素值,我想测试它。)

我不打算将整个代码放在这里以便于阅读,实现与in this link.相同

我有一个名为xml_handler的服务。我使用$this->get('xml_handler')在控制器中获取的服务。但后来,我开始使用Symfony2最佳实践并开始扩展ContainerAware。之后,下面的代码(定义为Before Listener)失败。

if($controller[0] instanceof LanguageInterface) {
        $xmlHandler = $controller[0]->get('xml_handler');

它引发了一个错误,即get()中没有$controller方法(IndexController是扩展ContainerAware的控制器的名称,但为了清晰起见,这并不重要)< / p>

问题出现后,我停止扩展Controller但开始扩展ContainerAware,正如我之前所说。

那么,我如何得到get()方法,这显然受到保护,尝试:

$controller[0]->container->get('xml_handler')

不起作用。我查看了API,但没有getContainer()方法。

我想,问题是,在我的情况下,如何在Before过滤器中访问控制器外的ContainerAware?

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

您必须将所有必需的依赖项传递给侦听器构造函数:

在你的听众中:

<?php

namespace Acme\MyBundle\EventListener;

class MyListener
{
    private $xmlHandler;

    public function __construct($xmlHandler)
    {
        $this->xmlHandler = $xmlHandler;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $controller = $event->getController();

        if (!is_array($controller)) {
            return;
        }

        if ($controller[0] instanceof LanguageInterface) {
            $this->xmlHandler->doSomething(...);

            // ...

在配置文件中,您必须要求依赖注入组件提供xml_handler服务作为侦听器构造函数的参数(依赖项)。

services:
    acme_my.listener.action:
        class: Acme\MyBundle\EventListener\MyListener

        arguments:
            - "@xml_handler"

        tags:
            - { name: kernel.event_listener, event: kernel.controller, method:  onKernelController }