Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Упс, я не в тот раздел написал. Использую 7 версию ларавеля. Но не буду дублировать, чтоб не считалось спамом, модераторы, если можно - перенесите, пожалуйста в раздел Laravel 6/7
В проекте 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?)
Как же лучше всего реализовать?
Страницы 1