Vlad
просто в try catch и asJson? выбрасывать BadRequestHttpException?
https://symfony.com/blog/new-in-symfony-6-3-http-exception-attributes
Vlad
Описывай свои бизнесовые исключения и привязывай нужный хттп код. Через атрибут или конфиг
Nikolay
ProblemNormalizer вот с этим поподробнее. Как раз уже видел через withHttpStatus код все работает
Nikolay
а вот сообщения на рфонт пустое
Nikolay
bad Request и все
Nikolay
ProblemNormalizer берет и скрывает текст сообщения -_-
Vlad
Чтобы не скрывал
Nikolay
а можно пример кода если сложно, где это сделать?
Vlad
Погугли как задекорировать сервис
Vlad
В доке этот момент описан.
Nikolay
Спасибо за наводку! Кажется понял в чем проблема... Симофни ожидает, чтобы я туда еще передавал значения...
Nikolay
Михаил
Ну, я делаю по другому. У меня есть подписчик который слушает эксепшоны. Если ловит доменное исключение - то пытается зарендерить его исходя из: 1) какой аттрибут типа висит на исключении (ошибка клиентская, логическая, ошибка ненахода итд) 2) кто был инициатором запроса (админка, приватный апи, публичный апи) 3) ожидаемый формат 4) есть ли у исключения прикреплённые контекстные данные И дальше пытаюсь сделать из исключения ответ, после чего делаю $event->setResponse($response); … внутри сабскрайбера.
Михаил
Если ловит любое другое исключение - 500
Михаил
Если контроллер сам перехватил исключение, то он сам решает что да как, хотя такое редко происходит
Nikolay
То есть писать свой обработчик не очень хотелось:)
Nikolay
Но с другой стороны код более подконтролен. Свои Exception
Михаил
20 строчек, боже
Vlad
20 строчек, боже
ну зачем писать, если можно не писать))
Nikolay
Зато скрытых от глаз:)
Михаил
Да вы на сеттерах и геттерах теряете больше времени
Nikolay
ноуп ноуп, таким не занимаемся, маппим руками:)
Михаил
Стоп, а вам не платят за кол-во строк?
Nikolay
Тут же не про время, а про реализацию. Вот есть рассово верный подход симфони, а есть 20 строк на коленке васяна
Михаил
@admin
Nikolay
Тут ни в коем случае не про скорость, оптимальность, а про хорошую практику, которую знает комьюнити
Михаил
Тут ни в коем случае не про скорость, оптимальность, а про хорошую практику, которую знает комьюнити
1) Объявить листенер 2) Внутри листенера вызвать фабрику стратегий на основе исключения 3) Запросить у стратегии создать респонс на основе исключения 4) Установить респонс
Михаил
Я понимаю что вы можете парировать это composer require foo/bar Но 1) там тоже нужно будет возиться 2) если вам нужно будет большее придётся парится и умолять мейнтейнера
Vlad
Вешаю на исключение хттп код и кайфую 😎
Михаил
Это решит проблему только http кодов
Vlad
Так зачем тебе кастомный респонс на каждое исключение?
Михаил
Ты ещё не понял? Я ебанутый!
Vlad
Мне кажется одного формата хватает за глаза
Vlad
А зоопарк делать то зачем
Михаил
Не хватит. Когда клиент запросит пользака через rest api и когда он запросит его html, будет очень странно отвечать в обоих случаях жисоном
Михаил
В случае ошибки или ненахода
Vlad
И будет рендер и в джсон и html
Михаил
Ну вот. Вот тебе и ответ на вопрос «зачем не 2 формата» А вот тебе и 3 формат. В большинстве случаев твой респонс «user with id 322 not found» нафиг не кому не впёрся. Особенно если речь касается разных фронтендов. Будь то публичный или приватный апи. Но часто публичный апи должен вернуть инструкции фронтенду что ему делать в случаи возникновения ошибок. И для разных ошибок, для разных сущностей эти инструкции разные.
Михаил
Приватный апи конечно не должен - так как у него широкий пользователь
Vlad
И будет рендер и в джсон и html
https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Accept
Vlad
это из коробки есть
Михаил
Да это в симфе из коробки
Nikolay
Да только не рабоатет из коробки, так как ожидаешь, затирает message
Nikolay
А вообще очень редко видел кейс, где ендпоинт разный формат возвращает. Как фича много где. Как реальное использование....
Vlad
Да только не рабоатет из коробки, так как ожидаешь, затирает message
Я уже ответил))) сделай декоратор и будет тебе счастье
Михаил
Ну вот. Листенер - нет Декоратор - да
Nikolay
Да не получается у меня:) Тут курить и курить. Продампил контейнер, смотрю этот PRoblemNormlizer подключен. Дебаггером пробежался по нему
Nikolay
смотрю exception ждет внутри еще exception предыдущий
Vlad
Ну вот. Листенер - нет Декоратор - да
Ну так у тебя скока наворотов)
Михаил
Симфа - как linux В ней можно всё настроить и ты будешь всё настраивать
Vlad
Лисанеры, стратегии какие то
Nikolay
И получается throw new BadRequestHttpEception надо вызывать в блоке catch и в него в previous еще передавать ошибку
Nikolay
Так и так этот ProblemNormalizer отрабатывает
Михаил
Ну так у тебя скока наворотов)
Ну так я про это говорю. Что тебе что мне всё равно нужно писать код и дошлифовывать решение. Просто у меня всё кастомное, а значит решает тоньше проблему. Все же идёт от проблемы, верно?
Nikolay
Я вижу два варианта. 1. Лучше изучить доку сериализоватра и ошибок (тупой вариант согласен) 2. Написать свое на коленке в листенере.
Nikolay
https://pastebin.com/6naZQTVX
Хм.. Так он же и так работает...
Nikolay
А стоп
Vlad
не так же. если бы так же сообщение с исключения сохранялась
Михаил
На самом деле конечно лучше сначала либы покрутить. Но просто обычно у всех таких решений путь один - на мусорке. Хотя и обратное тоже справедливо
Nikolay
А ты типо свою обертку сделал?
Михаил
Так что пробуйте всё
Vlad
Декоратор
Nikolay
https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/Serializer/Normalizer/ProblemNormalizer.php
Nikolay
Вот смотрю встроенный. А ты пишешь свой декоратор
Nikolay
ну тоже получается костыль что ли хахаха
Nikolay
Не мне главное было убедиться, что это "норм" подход. Декоратор, Листенер.. asJson
Vlad
https://github.com/symfony/symfony/blob/7.1/src/Symfony/Component/Serializer/Normalizer/ProblemNormalizer.php#L100
Vlad
ну так он же затирает, а ты хочешь чтобы не затирал
Vlad
ну или выставил debug true у сервиса 🤥
Vlad
но будет всегда стектрейс
Nikolay
Извиняюсь, наверное неправильно донес свою мысль. Идею с перепердоливаем и расширением функциональности фреймворка я знаю и использую. Приходится писать на 3 и даже на yii3 иногда... Но моя основная задача, делать так, что если меня собьет автобус, разработчик пришел и просто продолжил кодить.
Nikolay
Как сделать в симфони "стандартно" выброс ошибок, честно не знаю (не знал). Конечно решение в лоб Листенер заодно логгер. Но хорошая ли это практика?