我有一个使用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 }