symfony4 ArgumentResolver не запускается

Проблема

Не запускается argument resolver (аргументом является дата-объект App\DTO\SmthId.php) при присутствии параметра в роуте (например, '/smth/1'):

    /**
     *
     * @Route("/smth/{smthId}", name="show_smth", methods={"GET"})
     *
     * @param SmthId $id
     *
     * @return Response
     *
     * @throws EntityNotFoundException
     */
    public function showSmth(SmthId $smthId): Response
    {
        // ...
    }

Возникает ошибка

Argument 1 passed to App\Controller\SmthController::showSmth() must be an instance of App\DTO\SmthId, string given, called in .../vendor/symfony/http-kernel/HttpKernel.php on line 150

Решение

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

Вариантов решения 2:

  1. Вручную увеличить приоритетность Вашего резолвера (обязательно поставить больше 100) в services.yaml:
    App\ArgumentResolver\SmthIdResolver:
            class: App\ArgumentResolver\SmthIdResolver
            tags:
                - { name: controller.argument_value_resolver, priority: 101 }
  2. Просто изменить название переменной принимаемого дата-объекта так, чтобы оно не совпадало с названием переменной в роуте. Тогда Symfony после обработки переменной из роута наткнётся на неизвестную переменную (SmthId $newNameId) в аргументе контроллера, и пойдёт искать для него резолвер.
        /**
         *
         * @Route("/smth/{smthId}", name="show_smth", methods={"GET"})
         *
         * @param SmthId $newNameId
         *
         * @return Response
         *
         * @throws EntityNotFoundException
         */
        public function showSmth(SmthId $newNameId): Response
        {
            // ...
        }

    Если же он видит ту же переменную, что он уже обработал в роуте, он не захочет "делать работу дважды" и попытается её игнорировать :) Оттого и ошибка.

Источник