Можно ли изменить формат ответа сервера на XML в Laravel?
Всем привет. Начал писать API (учебный проект), и появилась задумка, чтобы пользователь в зависимости от настройки мог получать данные или в формате XML или в формате JSON. По умолчанию Laravel возвращает в JSON формате, но я добавил флаг в базу данных users - "response_format" и хочу, чтобы в зависимости от состояния этого поля в БД возвращался результат в нужном формате, т.е. если там стоит значение "xml" то формат ответа сервера менялся с json на xml... Хотелось бы узнать, можно ли сделать какой нибудь универсальный вариант, например через middleware, чтобы это правило применялось к группам роутов сразу?
Пробовал реализовать в middleware, через запрос к БД, "find($req)" поиск поля у юзера статуса ответа, но так получилось реализовать только ошибки, а если всё нормально, то middleware возвращает $next($request), и это уже в контроллере получается снова нужно искать пользователя, сверять его тип ответа и возвращать в нужном формате... может есть более простой способ, чтобы указать где нибудь в одном месте это правило?
Использовал: mtownsend/response-xml пакет.
PS: я только учусь, надеюсь понятно сформулировал вопрос и пояснения...
Ответы (3 шт):
Вам нужно создать middleware, поместить его в список middleware альясы, а также в список приоритетов в самом конце.
Внутри handle вашего middleware проверяете на формат ответа, и если он xml то извлекаете ответ, и преобразовываете его в XML:
public function handle($request, Closure $next)
{
$response = $next($request);
if($request->input('format') === 'xml') {
return response()->xml(json_decode($response->getOriginalContent()->getData()));
}
return $response;
}
Ну и в конце прописываете его в нужных роутах.
Спасибо за ответ! То что мне нужно было, только я немного модифицировал (не знаю, правильно или нет, может так не стоит делать, если что, поправьте).
В общем у меня выдало ошибку на getData(), еще какие то проблемы возникли с json_decode, также было подчеркнуто getOriginalContent(), но все работало, я посмотрел отладку dd($response) и модифицировал код следующим образом, стало все работать.
return response()->xml($response->original)
Лучше сделать middleware, которое бы реагировало не на $request->input('format'), а использовать заголовок Accept (https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Accept)
if($request->header('accept') === 'application/xml') {
// return xml response
}