Dependency injection Symfony2:如何在侦听器中获取配置参数?

Dependency injection Symfony2:如何在侦听器中获取配置参数?,dependency-injection,symfony,Dependency Injection,Symfony,我有一个监听服务。 我想读取其中的一些配置参数 如何访问侦听器类中的服务容器?已解决:我们需要将@service\u容器本身作为参数传递给侦听器服务 MyBundleName/Resources/services.yml: services: kernel.listener.locale_listener: class: My\BundleName\Listener\LocaleListener tags: - { name: ke

我有一个监听服务。 我想读取其中的一些配置参数


如何访问侦听器类中的服务容器?

已解决:我们需要将
@service\u容器本身作为参数传递给侦听器服务

MyBundleName/Resources/services.yml

services:
    kernel.listener.locale_listener:
        class: My\BundleName\Listener\LocaleListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        arguments: [ @service_container ]
侦听器类:

class LocaleListener
{
    protected $container;

    public function __construct(\Symfony\Component\DependencyInjection\Container $container)
    {
        $this->container = $container;
    }
..

    public function Myfunction()
    {
        $languages = $this->container->getParameter('languages');
    }

}

您可以使用
%your_param_name%
符号将容器参数传递到服务中:

services:
    kernel.listener.locale_listener:
        class: My\BundleName\Listener\LocaleListener
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        arguments: [ @router, @service_container, %your_param_name% ]
在本例中,它将显示为服务构造函数方法中的第三个参数:

public function __construct($router, $container, $paramValue)
{
    // ...
}

在这种情况下,传递整个容器是个坏主意™.@Elnur-为什么传递整个容器是个坏主意?@Robin,因为依赖项应该是显式的,并且易于模拟以进行测试。此外,让您的类了解DIC会将它们与特定的DIC联系起来。不好,不好。不要使用FQDN!!关于这一点有更多的文档吗?我还有一个监听器作为服务。在我的config.yml中,我有一些我希望在侦听器中访问的设置,我是否应该将它们配置为参数?请注意,由于Symfony 2.8,您必须引用这些参数:参数:[“@router”、“@service_container”、“%your_param_name%”不适用于我,或者至少不适用于代表Symfony 4中的kernel.response事件调度的FilterResolveEvent。使用0个参数保持调用构造函数,从而导致异常。在网上搜索并没有给出任何线索,但在这里的SO或博客中有一些过时的匹配,只是重复了Symfony官方教程中的部分事实。抱歉,但整个框架是一团糟。。。是否有任何官方文档页面解释了所有这些“在YAML中使用%或@放置参数,以便事件侦听器相应地在构造函数中获取参数”?