【问题标题】:Symfony 2: why injecting kernel into service is bad idea?Symfony 2:为什么将内核注入服务是个坏主意?
【发布时间】:2017-01-16 08:44:24
【问题描述】:

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

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

【问题讨论】:

    标签: php symfony dependency-injection


    【解决方案1】:

    Richard Miller 的一篇文章[0] 解释了这个问题。它的要点是,取决于当前的应用程序环境是一种设计不良架构的代码味道,并且会让你依赖于具体的实现。

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

    应用程序不应该知道它正在运行什么环境 下,它应该只是根据它的特定方式配置 配置文件。因为我们想改变配置 不同的环境通常有不同的配置 这些环境中的每一个。我们选择这些集合中的哪一个 要加载的配置,而不是告诉应用程序哪个 它所处的环境。

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

    【讨论】:

    • 我正在实现的服务是基于 RESTful 应用程序中的当前环境包装异常。我认为服务中的简单开关/案例将比为每个环境实现单独的类更方便。
    • @Kostek 你在问为什么这是一个坏主意,而不是更简单。
    • 实际上我在问为什么注入内核是个坏主意。我读到有些人认为它比注入容器本身更糟糕,所以我想知道为什么,这样做的缺点是什么。
    【解决方案2】:

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

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

    【讨论】:

    • 伙计们,downvoting 是可以的,但你应该解释为什么.. 我完美地回答了他的问题Isn't it better sollution than injecting whole container into my service? -> 不要注入整个容器,而只是注入环境变量
    • 实际上我无法注入“%kernel.environment%”。它一直说服务不存在。
    • 尝试写arguments: ["%kernel.environment%"],它可能会成功(我在我的项目中使用它,就像一个魅力)如果它仍然不起作用我会检查配置,也许我我忘记了什么
    • 您使用的是什么版本的 Symfony?我目前正在开发 2.8
    • 我使用的是 2.8.2 版本
    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2017-01-31
    • 2016-02-11
    • 2012-06-03
    相关资源
    最近更新 更多