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 { // ... }Если же он видит ту же переменную, что он уже обработал в роуте, он не захочет "делать работу дважды" и попытается её игнорировать :) Оттого и ошибка.
Источник
- https://toster.ru/q/527412
- Log in to post comments
- 2219 reads