【问题标题】:Symfony services.yaml binding arguments from vendor Bundle来自供应商 Bundle 的 Symfony services.yaml 绑定参数
【发布时间】:2020-06-07 10:24:58
【问题描述】:

我已经准备好我的 CMS Bundle,它存储在我的私人存储库中,并通过 Composer 添加到 vendor 目录。

为什么绑定来自@MyBundle/Resources/config/services.yaml 的标量参数不起作用?我必须将它们复制粘贴到应用程序config/services.yaml

请查看我的供应商捆绑包中的 services.yaml:

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false
    bind:
      $suffix: '%env(SUFFIX)%'
      $loadBlocks: '%mmcms.load_blocks%'

和 app/config/services/yaml

services:
    _defaults:
        autowire: true      
        autoconfigure: true

        bind:
            $sender: Custom name
            Psr\Log\LoggerInterface $appCrash: "@monolog.logger.appcrash"

当我在供应商捆绑服务中使用$suffix 时,它可以工作,但如果我想在我的应用服务的构造函数中自动装配它,它就不起作用。

得到一个错误:

Cannot autowire service "App\Mailer\MailerHelper": argument "$suffix" of method "__construct()" is type-hinted "string", you should configure its value explicitly.

我知道这个绑定,默认只针对这个特定的服务文件,所以范围是捆绑包。

是否有可能以某种方式处理它以便不复制粘贴绑定配置?

【问题讨论】:

  • 考虑更新您的问题,显示您的两个服务文件的相关部分。没有理由将包中定义的参数绑定到应用程序中的值不起作用。可能是笔误。这是example
  • @Cerad 我添加了代码示例。如文档中所示,您有提供者的链接,他们说这是本地绑定,这就是为什么它可能不起作用? SO local for vendor bundle 在应用程序中不起作用?
  • 当然不是。 _defaults 下的任何内容仅适用于特定 services.yaml 文件中定义的服务。
  • 没错,有没有一种很好的方法来解决这个问题而不是重复代码?
  • 不鼓励在捆绑包中使用自动装配,因此从这个意义上说,没有什么需要修复的。另外,全局绑定似乎不是一个好主意。想象一下加载一个包并将其绑定到某个通用名称。可能会令人困惑。但是不,我想不出解决办法。怀疑在编译过程中绑定信息是否可用。

标签: symfony dependency-injection


【解决方案1】:

是的,有办法! 如果您将 CMS 捆绑包作为供应商捆绑包,只需在其中配置您的服务,不要依赖自动连接。将 services.yaml 文件放在‘Resources/config/services.yaml’中,然后你需要在你的依赖注入文件中加载配置,这里是example

【讨论】:

  • 谢谢。我可能没有问过正确的问题:) 我说的是绑定参数。参数已加载到主 App,但我想绑定标量参数,以便它们可用于 App 中的 Services 构造函数。像:_defaults: bind: $myParameter: '%my_parameter%' 然后可以通过 $myParameter 变量注入服务构造函数。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 2012-10-03
  • 2018-07-06
  • 1970-01-01
  • 2019-03-29
  • 2013-02-27
  • 2019-08-19
  • 2012-11-28
相关资源
最近更新 更多