Size: a a a

2020 November 19

AD

Andrey Dembitskyi in symfony
Dmitry Khaperets
Всем привет!
Нужно отловить исключения TypeError, возникшие именно при резолвинге аргументов контроллера: Есть идеи как сделать?
Создал подписчика TypeErrorExceptionSubscriber на события KernelEvents::EXCEPTION, проверяю, что получаю нужный тип исключения ($event->getThrowable() instanceof \TypeError). А как далее проверить, что исключение возникло при резолвинге аргументов контроллера не накопал...
Stacktrace)))
источник

DK

Dmitry Khaperets in symfony
Поясню: когда в аргументах контроллера указываешь тип (к примеру: int $id), а вместо int приходит строка - возникает исключение TypeError, нужно его перехватывать, чтобы выдавать нужный ответ
источник

DK

Dmitry Khaperets in symfony
Andrey Dembitskyi
Stacktrace)))
Да, пробовал, но ничего обобщенного не накопал
источник

AN

Alexander Nazarov in symfony
Dmitry Khaperets
Поясню: когда в аргументах контроллера указываешь тип (к примеру: int $id), а вместо int приходит строка - возникает исключение TypeError, нужно его перехватывать, чтобы выдавать нужный ответ
Делай свой кастомный резолвер и решай это в нем.
источник

VM

Volodymyr Melko in symfony
Dmitry Khaperets
Поясню: когда в аргументах контроллера указываешь тип (к примеру: int $id), а вместо int приходит строка - возникает исключение TypeError, нужно его перехватывать, чтобы выдавать нужный ответ
напили свой резолвер
источник

DK

Dmitry Khaperets in symfony
Хм.. вариант..
Типо последним вызывается мой кастомный резолвер который тупо выбрасывает нужное исключение и больше ничего не делает
источник

AN

Alexander Nazarov in symfony
Не последним
источник

DK

Dmitry Khaperets in symfony
Alexander Nazarov
Не последним
Нужно чтобы все резолверы отработали, и если ни у кого не получилось разрулить аргумент - тогда выбрасывается исключение
Не уверен, что сработает, но попробую
источник

AN

Alexander Nazarov in symfony
Dmitry Khaperets
Нужно чтобы все резолверы отработали, и если ни у кого не получилось разрулить аргумент - тогда выбрасывается исключение
Не уверен, что сработает, но попробую
ну так первым сработает резолвер который кидает тебе TypeError. И до твоего даже дело не дойдет.
источник

VM

Volodymyr Melko in symfony
Alexander Nazarov
ну так первым сработает резолвер который кидает тебе TypeError. И до твоего даже дело не дойдет.
говорю же дичь =)
источник

DK

Dmitry Khaperets in symfony
Alexander Nazarov
ну так первым сработает резолвер который кидает тебе TypeError. И до твоего даже дело не дойдет.
Верно.. И как тогда быть?
источник

AN

Alexander Nazarov in symfony
Ну читани доку по резолверам и сразу все понятно будет.
источник

DK

Dmitry Khaperets in symfony
Alexander Nazarov
Ну читани доку по резолверам и сразу все понятно будет.
Это первое, что сделал)
источник

AN

Alexander Nazarov in symfony
Ну так, смотри supports метод. Чтобы он забирал на себя резолв.
источник

VM

Volodymyr Melko in symfony
Dmitry Khaperets
Поясню: когда в аргументах контроллера указываешь тип (к примеру: int $id), а вместо int приходит строка - возникает исключение TypeError, нужно его перехватывать, чтобы выдавать нужный ответ
смори, если у тебя есть линка /users/:id
и этот ид должен быть числом и ты в требованиях к аргументу напишешь это, а кто-то шлет реквест /users/hui, то симфа сама отстрелит 404, мол не нашла подходящей урлы. Что тебе еще не хватает?
источник

DK

Dmitry Khaperets in symfony
Volodymyr Melko
смори, если у тебя есть линка /users/:id
и этот ид должен быть числом и ты в требованиях к аргументу напишешь это, а кто-то шлет реквест /users/hui, то симфа сама отстрелит 404, мол не нашла подходящей урлы. Что тебе еще не хватает?
Это один из вариантов. Если указать, что id должен быть числом - будет все ок.
Если же в аргументах используется DTO, которое заполняется из запроса и в свойство объекта сетится неверный тип - снова будет исключение
источник

VM

Volodymyr Melko in symfony
кастомное ДТО заполняется кастомным же резолвером.
обычно на дто вешают аннотации для валидатора и после заполнения валидируют. ошибки валидации выплевывают в бед реквест ексепшен сразу же
источник

AN

Alexander Nazarov in symfony
Dmitry Khaperets
Это один из вариантов. Если указать, что id должен быть числом - будет все ок.
Если же в аргументах используется DTO, которое заполняется из запроса и в свойство объекта сетится неверный тип - снова будет исключение
Ну тогда тем более, твой кастомный резолвер проверит типа на ДТО и будет резолвить.
источник

VM

Volodymyr Melko in symfony
Dmitry Khaperets
Это один из вариантов. Если указать, что id должен быть числом - будет все ок.
Если же в аргументах используется DTO, которое заполняется из запроса и в свойство объекта сетится неверный тип - снова будет исключение
источник

DK

Dmitry Khaperets in symfony
Всем спасибо! Буду пробовать
источник