过滤器前后的Symfony2不能与容器感知一起工作


Symfony2 before and after filters doesn't work with containeraware

我有一个使用xml的多语种网站。(我知道Symfony Translations存在,但我正在实现我自己的系统,用于访问和获取xml元素值,我想测试它)。

为了便于阅读,我不打算把整个代码放在这里,实现和这个链接一样。

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

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

它引发了一个错误,在$controller没有get()方法(IndexController是扩展ContainerAware的控制器的名称,但这并不重要,只是为了清晰)

问题出现后,我停止扩展控制器,但开始扩展ContainerAware,如前所述。

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

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

是行不通的。我看过API,但没有getContainer()方法。

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

谢谢你的回答

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

在你的监听器:

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