Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 6/7/8/9/10 » Унификация JSON-ответов » 07.08.2020 20:34:55

Упс, я не в тот раздел написал. Использую 7 версию ларавеля. Но не буду дублировать, чтоб не считалось спамом, модераторы, если можно - перенесите, пожалуйста в раздел Laravel 6/7

#2 Laravel 6/7/8/9/10 » Унификация JSON-ответов » 07.08.2020 20:30:47

Dmitry_Milk
Ответов: 1

В проекте REST API есть требование к JSON-ответам - все они должны быть в формате

{
    "success": true,
    "response": тут все остальное JSON-дерево ответа
}

или

{
    "success": false,
    "error": тут все остальное JSON-дерево ошибок
}

И если с ошибочными случаями дело решается в централизованном месте Exceptions\Handler, то вот с успешными ответами как-то не очень. Уж очень не хочется в каждом методе контроллера вызывать что-то типа

return $this->successResponse(.....);

тем более, что используются API-ресурсы, и получаются нечитабельные вещи типа

return $this->successResponse(new UserResource::collection($users));

Первая мысль была - наверное можно сделать это прямо в самих ресурсах. Но в них есть только wrap(), задающий ключ внешней обертки объекта, а универсального способа задать произвольный формат внешней обертки единичного ресурса или коллекции я не нашел.

Другая мысль - использовать middleware. Уже задействована одна middleware, выставляющая хедер "Accept: application/json" для любых роутов под "/api/", и таким образом дающая $request->wantsJson() === true и ответы об ошибках всегда в JSON-формате. Идея - "допилить" Response, полученный из обработчика предыдущего middleware, достав getOriginalContent и обернув его в требуемый общий формат. Но что-то мне подсказывает, что это не годный способ - и лишний раз конверсия объекта в JSON-строку, и обработчик исключений тут уже приходит обернутый (то есть, убирать ошибочные случаи из Exceptions\Handler и делать в этом middleware?)

Как же лучше всего реализовать?

Подвал раздела