Я переношу существующий проект Symfony 2.8 на Symfony 3.4. После добавления существующего AppBundle в новый сгенерированный проект Symfony 3.4 возникает следующая ошибка:
Cannot autowire service "AppBundle\Controller\CustomExceptionController": argument "$useDebugMode" of method "__construct()" is type-hinted "bool", you should configure its value expl icitly
Я нашел еще несколько вопросов об этой проблеме, но решение всегда указывает на недостающие параметры в файле service.yml. Однако, насколько я могу судить, проблема здесь не в этом:
// CustomExceptionController.php
namespace AppBundle\Controller;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController;
...
class CustomExceptionController extends ExceptionController {
public function __construct(\Twig_Environment $twig, bool $useDebugMode, Translator $translator) {
parent::__construct($twig, $useDebugMode);
...
}
...
}
// services.yml
services:
...
app.exception_controller:
class: AppBundle\Controller\CustomExceptionController
arguments: ['@twig', '%kernel.debug%', "@translator.default" ]
Я не устанавливал / не определял %kernel.debug% в app/config/config.yml, но полагаю, что в этом нет необходимости. Это?
Таким образом, значение параметра $useDebugMode явно установлено равным значению %kernel.debug%. Итак, как решить ошибку?




// services.yml
services:
...
app.exception_controller:
class: AppBundle\Controller\CustomExceptionController
arguments:
$useDebugMode: '%kernel.debug%'
Укажите только $useDebugMode в списке аргументов, два других будут автоматически введены / подключены.
$useDebugMode должен быть таким же, как в конструкторе.
Хотя это немного улучшает ситуацию, но не решает реальной проблемы.
О, кстати говоря, параметр kernel.debug можно разрешить после настройки службы. Попробуйте установить $useDebugMode: true
Прочтите мой комментарий под исходным вопросом. Ошибка полностью исходит из чего-то другого.
Если он передает конфигурацию службы, то kernel.debug разрешается позже, и вы должны выбрать другой параметр или ввести туда весь контейнер, что не является лучшим решением.
Еще раз, это не имеет ничего общего с параметром отладки и все, что связано с идентификатором службы. Сделайте себе простой проект и попробуйте. Сообщение об ошибке очень распространено и, возможно, немного вводит в заблуждение. Если вы планируете использовать autowire, вы столкнетесь с этим и потратите много времени (по крайней мере, я), понимая, в чем настоящая проблема. После этого все становится тривиальным.
Истинный. В этом случае присвойте ему псевдоним имени класса, если вы настаиваете на использовании идентификатора службы, и посмотрите, повторится ли это снова.
Проблема в том, что когда autowire сканирует каталог вашего контроллера и выбирает CustomExceptionController, он ищет в контейнере определение службы с идентификатором CustomExceptionController. Ваш идентификатор - app.exception.controller, поэтому совпадение не найдено, поэтому он пытается подключиться и подавляет параметр. Просто измените идентификатор на полное имя класса, и он должен работать. Или исключите CustomExceptionController из autowire.