Symfony 如何向在services.yaml外部注册的服务提供参数

Symfony 如何向在services.yaml外部注册的服务提供参数,symfony,autowired,Symfony,Autowired,我对Symfony自动布线有问题。 我需要用我自己的服务替换其中一个第三方服务。 服务最初的定义如下: ewz_recaptcha.form.type: class: EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType public: true arguments: - '%ewz_recaptcha.public_key%' - '%e

我对Symfony自动布线有问题。 我需要用我自己的服务替换其中一个第三方服务。 服务最初的定义如下:

    ewz_recaptcha.form.type:
        class: EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType
        public: true
        arguments:
            - '%ewz_recaptcha.public_key%'
            - '%ewz_recaptcha.enabled%'
            - '%ewz_recaptcha.ajax%'
            - '@ewz_recaptcha.locale.resolver'
            - '%ewz_recaptcha.api_host%'
        tags:
            - { name: form.type }
我的定义类似:

    ewz_recaptcha.form.type:
      class: App\Form\Type\EWZRecaptchaType
      public: true
      arguments:
          - ''
          - false
          - '%ewz_recaptcha.ajax%'
          - '@ewz_recaptcha.locale.resolver'
          - '%ewz_recaptcha.api_host%'
      tags:
          - { name: form.type }
我忽略了前两个参数,因为它们是稍后从数据库加载的(这就是我在服务中所做的更改)

现在,如果我把它放在
config/services.yaml
但是,由于在这个项目中,我仅将该文件用于项目服务,并且我将所有覆盖内容放入第三方配置文件中,因此我尝试将其移动到
config/packages/ewz_recaptcha.yaml

但现在我得到的错误是:

无法自动连线服务“App\Form\Type\EWZRecaptchaType”:方法“EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType::\uu构造()”的参数“$publicKey”没有类型提示,应显式配置其值。

我甚至连接到
Symfony\Component\DependencyInjection\Compiler\AutowirePass
来检查发生了什么,当在
services.yaml
中定义时,
$arguments
参数填充了我的参数,但当移动到
ewz\u recaptcha.yaml
arguments数组是空的


当在services.yaml文件之外定义服务时,是否有其他定义参数的方法?

最可能的问题是,
App\Form\Type\EWZRecaptchaType
被意外地在两个地方注册。您可以在
config/packages/ewz_recaptcha.yaml
中手动执行此操作,此外,psr-4 discover将在
config/services.yaml
中进行收集

#config/services.yaml
services:
    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
解决方案是将表单类型添加到此处排除的类中,以防止其被注册,例如,使用以下方法:

        exclude: '../src/{DependencyInjection,Entity,Form/Type/EWZRecaptchaType.php,Migrations,Tests,Kernel.php}'

这很有效,但我觉得可疑。如果定义了显式类,Symfony是否应该忽略自动加载?每个文件都会添加类<代码>服务。yaml不知道服务是否在其他地方注册。此外,您将使用两个不同的名称注册服务,即services.yaml中的classe名称和您的
ewz_recaptcha.form.type
。Symfony假定您是有意这样做的,但有一项服务显然没有完全配置。您也可以使用其他解决方案,如不手动自动连接该类或将参数绑定到该类型的每个服务,但我认为我的解决方案是最简单的,当您需要这两个文件时。@hubertnn-出于好奇,您的工作解决方案是否仍在config/packages/ewz_recaptcha.yaml中定义该服务?如果它能工作,那就太好了,但我没想到您能在bundle配置文件中定义服务。您是否确认正在获取您的EWZRecaptchaType版本?