@Student18ru

Хелпер Laravel dd() возвращает ошибку 500?

Я вот что заметил, у меня есть старый проект, и там хелпер dd() возвращает код сервера 200, в новой версии Laravel, у меня возвращается код 500, при использовании данного хелпера. Меня это смутило. И я вот сейчас думаю, так и должно быть, или я дурак сломал что-то? Я реально сижу 3 часа и думаю, так и должно быть? Помогите.
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Конкретно по твоему случаю я не знаю, но у меня такое было из-за корсов.

Запрос для апи должен вернуть заголовки CORS которые не могут быть возвращены, т.к. ты прервал программу с помощью dd(). Браузеры в итоге пишут вроде 500, а вкладки "контент" вообще нет. Причем если напрямую в браузер адрес апи вбить то ответ есть. Но есть же POST запросы, которые надо расширением делать заголовок на POST менять или писать "псевдо-пост" типа "если есть флаг $_GET['method']=POST то воспринимать как пост. Для дебага конечно, на проде нельзя.

Чтобы их вернуть нужно "как-то" после dd() вернуть ещё респонс и отправить его. И это только пол-проблемы, т.к. запроса будет два. И заголовки нужно вернуть и в OPTIONS запросе (одни) и в обычном запросе (другие), на чем часто горят задницы многих разработчиков типа "задолбался с cors". Ну да, там и вправду творческое задание. Только лучше иметь установленный файрфокс, чтоб дебажить, вслепую быстро доводит до срыва.

Один из способов - зайти в доку symfony/var-dumper, сделать маленький класс из двух методов и там с помощью varcloner вернуть вывод dd() в переменную. После этого вместо dd() вывести его результат через echo, и позволить запросу завершиться (но это не всегда возможно, если ты поймал критическую ошибку - в этом случае управление перейдет Exceptions\Handler.php (в ларе) или если скрипт очень длинный, тогда будешь ждать минуту каждый раз чтоб дебагнуть.

Второй способ - вместо dd() бросать исключение и его обрабатывать в Handler.php, который формирует ответ-исключение (может делать, если режим сайта дебаг и тд.) там тоже можно преобразовать в другой вид. Но опять же хотя обработка исключений это стандартный процесс для большинства фреймворков - мне его задумка не очень нравится просто потому, что у нас есть контроллер с респонсами, а тут еще одна приблуда, которая до кучи еще и настроена по-своему во имя возможностей которыми почти никто не пользуется. Но тем не менее код выполнится уже на этапе response->send() а значит отправятся нужные заголовки, а потом выведется dd() который написано выводить если "исключение такое-то".

Обычный трайкетч в файле index.php часто делает то же самое и более податлив к допилам, чем разбираться как это же делает "настроенный кем-то обработчик" который умеет два метода - render() и notify() который один для отрисовки, второй для отправки куда-то, создается ощущение, что "больше ничего нельзя", а код это все таки свобода мысли.

Есть ещё совсем уж злой способ - register_shutdown_function(), где ты принудительно вернешь пустой респонс с 500 ошибкой, но вот вывод dd() придется прокидывать через костыль. И потом register_shutdown_function() особенно весело мирить с каким-то шаблонизатором типа Plates, Twig или Blade, которые по дефолту как правило просто не выводят исходник html, если поймают внутри ошибку тупо завершая ob_get_clean() вместо ob_get_flush(), в итоге эксепшен есть, а dd() нету, т.к. он был в хтмл, который остановился и очистился.

Оба варианта не очень логичны и костыльны, зато позволяют потом в том же постмане или браузере видеть в апи не json, а нашу dd() шку. Там помучаться надо немного, но сильно сократит время на создание полного зеркала апи в постмане или сваггере и слежения за ним. Все-таки сказать человеку "нажми F12" против убить день на то, чтобы он выучил возможности сваггера, а потом ты их выучил, а потом ты их описал, потом понял ограничения - лишние действия под сомнительный итог "у нас документация по канонам". Все равно придется объяснять новым как что работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы