Symfony 2:为什么在服务中注入内核不是一个好主意


Symfony 2: why injecting kernel into service is bad idea?

我需要在我的服务中获得当前的应用程序环境。我发现我可以从内核中获得它,但是很多人说注入内核是不好的主意。
有人能解释一下为什么它实际上被认为是不好的做法吗?难道这不是比将整个容器注入到我的服务中更好的解决方案吗?

my_app.my_not_so_great_service:
    class: AppBundle'Services'AppService
    arguments:
      - "@kernel"

Richard Miller的一篇文章[0]解释了这个问题。它的要点是,依赖于当前的应用程序环境是一种设计不良的体系结构的代码气味,并将使您依赖于具体的实现。

您不容易(热)交换不同环境的实现逻辑,因为您可能会针对一堆if/switch-语句编写代码。相反,您应该使用可以表示不同环境的抽象。

应用程序不应该知道它正在运行的环境在下面,它应该以一种基于它的特定方式配置配置文件。因为我们想改变构型不同的环境通常有不同的配置每一种环境。我们从这些集合中选择配置来加载,而不是告诉应用程序环境

[0] http://richardmiller.co.uk/2013/05/28/symfony2-avoiding-coupling-applications-to-the-environment/

内核对象包含整个应用程序,如果你需要环境,只需注入它:

my_app.my_service:
    class: AppBundle'Services'MyAppService
    arguments:
        - '%kernel.environment%'