Ошибка службы Autowire после перехода на Symfony 3.4 - Как явно настроить значение?

Я переношу существующий проект 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%. Итак, как решить ошибку?

Проблема в том, что когда autowire сканирует каталог вашего контроллера и выбирает CustomExceptionController, он ищет в контейнере определение службы с идентификатором CustomExceptionController. Ваш идентификатор - app.exception.controller, поэтому совпадение не найдено, поэтому он пытается подключиться и подавляет параметр. Просто измените идентификатор на полное имя класса, и он должен работать. Или исключите CustomExceptionController из autowire.

Cerad 10.12.2018 14:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
655
1

Ответы 1

// services.yml
services:
    ...
    app.exception_controller:
        class: AppBundle\Controller\CustomExceptionController
        arguments:
           $useDebugMode: '%kernel.debug%'

Укажите только $useDebugMode в списке аргументов, два других будут автоматически введены / подключены.

$useDebugMode должен быть таким же, как в конструкторе.

Хотя это немного улучшает ситуацию, но не решает реальной проблемы.

Cerad 11.12.2018 16:08

О, кстати говоря, параметр kernel.debug можно разрешить после настройки службы. Попробуйте установить $useDebugMode: true

Domagoj 11.12.2018 16:11

Прочтите мой комментарий под исходным вопросом. Ошибка полностью исходит из чего-то другого.

Cerad 11.12.2018 16:12

Если он передает конфигурацию службы, то kernel.debug разрешается позже, и вы должны выбрать другой параметр или ввести туда весь контейнер, что не является лучшим решением.

Domagoj 11.12.2018 16:13

Еще раз, это не имеет ничего общего с параметром отладки и все, что связано с идентификатором службы. Сделайте себе простой проект и попробуйте. Сообщение об ошибке очень распространено и, возможно, немного вводит в заблуждение. Если вы планируете использовать autowire, вы столкнетесь с этим и потратите много времени (по крайней мере, я), понимая, в чем настоящая проблема. После этого все становится тривиальным.

Cerad 11.12.2018 16:19

Истинный. В этом случае присвойте ему псевдоним имени класса, если вы настаиваете на использовании идентификатора службы, и посмотрите, повторится ли это снова.

Domagoj 11.12.2018 16:22

Другие вопросы по теме