Как предоставить параметры для сервиса, зарегистрированного за пределами services.yaml - PullRequest
1 голос
/ 30 января 2020

У меня проблема с 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 }

Я игнорирую первые 2 параметра, поскольку они загружаются позже из базы данных (это изменение, которое я сделал в сервисе).

Теперь это работает нормально, если я помещу его в config/services.yaml Но так как в этом проекте я использую этот файл только для сервисов проекта, и все перезаписи, которые я помещаю в сторонние конфигурационные файлы, я попытался чтобы переместить его в config/packages/ewz_recaptcha.yaml

Но теперь я получаю сообщение об ошибке: Cannot autowire service "App\Form\Type\EWZRecaptchaType": argument "$publicKey" of method "EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaType::__construct()" has no type-hint, you should configure its value explicitly.

Я даже подключился к Symfony\Component\DependencyInjection\Compiler\AutowirePass, чтобы проверить, что происходит, и когда определено в services.yaml параметр $arguments заполнен моими аргументами, но при перемещении в ewz_recaptcha.yaml массив аргументов пуст.

Есть ли другой способ определения аргументов, когда служба определена вне файла services.yaml?

1 Ответ

2 голосов
/ 30 января 2020

Скорее всего, проблема в том, что App\Form\Type\EWZRecaptchaType регистрируется в двух местах случайно. Вы делаете это вручную в вашем config/packages/ewz_recaptcha.yaml и, кроме того, psr-4 обнаруживает в вашем 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}'
...