Symfony v3.4 не может угадать автопроводку - PullRequest
0 голосов
/ 03 мая 2018

Symfony v3.4 не может угадать аргумент при использовании функции автопроводки.

Невозможно автоматически подключить службу «AppBundle \ Service \ MyServiceConfig»: аргумент «$ key» метода «__construct ()» не имеет подсказки типа, вы должны явно указать его значение.

Я также явно определил аргумент, но он все еще не работает. Аргумент имеет тип string длиной 136 символов.

services:
     app.myservice.config:
         class: AppBundle\Service\MyServiceConfig
         public: true
         arguments: ["%app_key%"] #defined in parameter.yml

    app.myservice
         class: AppBundle\Service\MyService
         public: true
         arguments: ["@app.myservice.config"]

Что работает абсолютно нормально, я могу видеть ожидаемые результаты при вызове служб.

Однако, когда я пишу AppExtension, я получаю вышеуказанную ошибку:

app.twig.my_app_extension:
    class: AppBundle\Twig\MyAppExtension
    arguments: [ "@app.myservice" ]
    tags:
       - { name: twig.extension }

поэтому я явно определил аргумент

app.myservice.config:
     class: AppBundle\Service\MyServiceConfig
     public: true
     arguments: 
         $key:  "%app_key%" #defined in parameter.yml

все равно не работает

Вот так выглядит класс MyServiceConfig:

 class MyServiceConfig implements MyServiceConfigInterface {

    /**
     * @var string
     */
    private $key;

   public function __construct($key){
    $this->key= $key;
 }
}

MyAppExtension Class:

/**
 * The MyAppExtension class
 */
 class MyAppExtension extends \Twig_Extension
  {
  /**
   * @var MyServiceConfigInterface $key
   */
  private $key;

  public function __construct(MyServiceConfigInterface $key){
    $this->key= $key;
  }
}

Решение, предоставленное здесь тоже не помогло, так как у меня есть service.yml внутри app/config/services.yml

1 Ответ

0 голосов
/ 04 мая 2018

Так мне стало скучно. Обновите файл app / config / services.yml:

#app.myservice.config:
AppBundle\Service\MyServiceConfig:
#    public: true
    arguments:
        $key: "%key%"

#app.myservice:
#    class: AppBundle\Service\MyAppService
#    arguments: ["@app.myservice.config"]
#    public: true

Ваш TwigExtension печатает на MyAppServiceInterface. Таким образом, autowire ищет в контейнере сервис с идентификатором MyAppServiceInterface. Он не смотрит на параметр класса вообще. Теперь в вашем случае MyAppService реализует ваш интерфейс, а autowire достаточно умен, чтобы признать, что существует только одна реализация вашего интерфейса.

Будьте более устойчивы, чтобы явно указывать псевдоним своей реализации на интерфейсе, чтобы предотвратить проблемы, если вы когда-нибудь решили добавить другую реализацию. В этом случае не обязательно.

AppBundle\Service\MyServiceConfig:
    { $key: "%key%" } # Just showing off here

AppBundle\Service\MyServiceConfigInterface: '@AppBundle\Service\MyServiceConfig'

И еще одна несвязанная вещь: не называйте свой класс расширения ветки AppBundleExtension. Похоже, вы путаете расширения ветки с расширениями связки. Два разных понятия. На самом деле это не имеет значения, но это может сбить с толку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...