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