【问题标题】:Environment specific services config in Symfony 3.4Symfony 3.4 中特定于环境的服务配置
【发布时间】:2018-10-18 01:36:07
【问题描述】:

我需要在dev环境中通过容器访问一些私有服务。

我认为这很简单 - 我会专门为 dev 公开它们,如下所示:

app/config/services.yml:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

    MyBundle\:
        resource: '../../*'
        exclude: '../../{Entity,Repository,DoctrineMigrations,DependencyInjection,Tests,Util}'

app/config/services_dev.yml:

imports:
- { resource: services.yml }

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: true

app/config/config_dev.yml

imports:
    - { resource: config.yml }
    - { resource: services_dev.yml }

然而这并没有产生预期的结果:服务表现得好像是私有的,配置根本没有合并(例如,当你有参数注入时,sy 喊我必须明确定义它们,即使父配置已经这样做了)。

有很多示例,在 Sy 的默认配置中,特定参数会被各种环境覆盖,但由于某种原因,服务似乎并非如此。服务配置是否以某种特殊方式处理?我误解了什么吗?这是怎么回事?

附:我知道依赖注入,我知道访问容器被认为是不好的做法,这不是问题的重点。请不要这样建议。

【问题讨论】:

    标签: php symfony symfony-3.4


    【解决方案1】:

    它不起作用,因为您的默认设置仅适用于 services_dev.yaml 中定义的服务。这不包括进口。

    你可以试试这样的services_dev.yaml

    services:
        _defaults:
            autowire: true
            autoconfigure: true
            public: true
    
        MyBundle\Services\MyPublicService: ~
    

    这将覆盖服务并将其公开。显然你必须用实际的服务替换类。

    您不需要导入其他服务。内核将负责加载此类。

    【讨论】:

    • 这似乎是真的。但是,我能够找到的文档中唯一的确认是文档中引入了这些更改的临时代码注释。有没有像你可以指出的引文?在任何情况下,由于默认值仅适用于这个文件,我尝试了批量导入选项,就像在 services.yml 中一样,但这会覆盖导入中的所有服务,这意味着如果你有需要额外配置的服务(比如参数绑定),你需要重新定义它们,此时您不妨复制整个文件。但是您建议的对于个别服务来说是一个很好的解决方案。
    • 您可以按照我上面显示的方式覆盖已定义的服务。这可能不适用于多个服务,所以像 MyBundle\: ~ 这样的东西可能不会像这样工作。我必须搜索解释它的引文,但至少在 symfony 4 风格的设置中开始一个新项目时,它会在 services.yaml 中的评论中告诉你:github.com/symfony/recipes/blob/master/symfony/framework-bundle/…
    • 我必须看一个示例项目并尝试看看是否像这样只覆盖公共选项是可行的。我唯一可能的解决方案是,创建一个仅在 dev/prod 中启用的 CompilerPass,它将覆盖所有已定义的服务(来自命名空间)并将它们设置为 public: true,但这可能是矫枉过正
    • 是的,这就是我所指的代码注释。它太容易错过了。我还在测试的上下文中偶然发现了编译器传递方法 - 对于测试,您希望您的私有服务可用。这里的问题本质上是相同的——服务的可见性取决于环境。它实际上可能不是那么矫枉过正和一个好的通用解决方案。具有讽刺意味的是,您的方法可能更适合测试,因为它明确列出了测试的服务,这似乎是个好主意。
    猜你喜欢
    • 2013-07-13
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2019-04-24
    • 2019-01-04
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多