symfony4 ArgumentResolver не запускается
Primary tabs
Проблема
Не запускается 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:
- Вручную увеличить приоритетность Вашего резолвера (обязательно поставить больше 100) в services.yaml:
App\ArgumentResolver\SmthIdResolver: class: App\ArgumentResolver\SmthIdResolver tags: - { name: controller.argument_value_resolver, priority: 101 }
- Просто изменить название переменной принимаемого дата-объекта так, чтобы оно не совпадало с названием переменной в роуте. Тогда Symfony после обработки переменной из роута наткнётся на неизвестную переменную (SmthId $newNameId) в аргументе контроллера, и пойдёт искать для него резолвер.
/** * * @Route("/smth/{smthId}", name="show_smth", methods={"GET"}) * * @param SmthId $newNameId * * @return Response * * @throws EntityNotFoundException */ public function showSmth(SmthId $newNameId): Response { // ... }
Если же он видит ту же переменную, что он уже обработал в роуте, он не захочет "делать работу дважды" и попытается её игнорировать :) Оттого и ошибка.
Источник
- Log in to post comments
- 1750 reads