我有多语言网站,它使用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?
感谢您的回答。
答案 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 }