Я пытаюсь перейти на symfony 3.3 и использовать новые функции autowire
/ autoconfigure
services:
Так в services.yml у меня есть:
services: _defaults: autowire: true autoconfigure: true public: false # makes classes in src/AppBundle available to be used as services AppBundle\: resource: '../../src/AppBundle/*' # you can exclude directories or files # but if a service is unused, it's removed anyway exclude: '../../src/AppBundle/{Entity,Controller,DQL,Form/DataTransformer,Repository}'
Я объявляю расширение своей ветки как:
AppBundle\Twig\ImageExtension: arguments: $env: "%kernel.environment%"
и конструктор для этой службы:
public function __construct(TokenStorage $token, UserRepository $userRepository, RedisCacheService $cache, string $env) { $this->env = $env; $this->user = $token->getToken() ? $token->getToken()->getUser() : false; $this->userRepository = $userRepository; $this->cache = $cache; }
кажется, что все в порядке, но я получаю эту ошибку:
(1/1) AutowiringFailedException Cannot autowire service "AppBundle\Twig\ImageExtension": argument "$env" of method "__construct()" must have a type-hint or be given a value explicitly.
и не знаю, как это исправить.
Поэтому проблема заключалась в том, что я пытался использовать services.yml из AppBundle, если я правильно понимаю, старый стиль импорта сервисов из пакетов не работает с autowiring / autoconfiguring, потому что нам нужно переписать метод load()
из AppExtension
для использования типа. Поэтому я заменил все свои сервисы на app/config/services.yml
и это помогает мне.
У меня было такое же сообщение об ошибке, но вызвано другой ошибкой. Может быть, кто-то найдет это полезным.
Моя первоначальная конфигурация в service.yml была:
app.my_service: class: 'AppBundle\Service\MyService' arguments: $foobar: 'some value for foobar' public: true
И я получал эту ошибку:
Невозможно выполнить аудит службы «AppBundle \ Service \ MyService»: аргумент «$ foobar» метода «__construct ()» должен иметь подсказку типа или явно указывать значение.
Затем несколько часов спустя я нашел решение:
AppBundle\Service\MyService: arguments: $foobar: 'some value for foobar' app.my_service: alias: AppBundle\Service\MyService public: true