Laravel: Как автоматически вернуть JSON для Eloquent

Источник: «How to Automatically Return JSON for Laravel Eloquent»
При работе с API часто требуется вернуть ответ Eloquent в формате JSON.

По умолчанию, Laravel преобразует ответ в JSON, если вы просто возвращаете Модель или Коллекцию Eloquent.

Пример с Коллекцией Eloquent

// Controller:
public function index()
{
return User::all();
}

Вернёт:

[
{
"id": 1,
"name": "Prof. Marcos Ratke",
"email": "providenci.hane@example.org",
"email_verified_at": "2023-01-04T12:26:19.000000Z",
"created_at": "2023-01-04T12:26:20.000000Z",
"updated_at": "2023-01-04T12:26:20.000000Z"
},
{
"id": 2,
"name": "Sincere Casper",
"email": "jaylin33@example.com",
"email_verified_at": "2023-01-04T12:26:19.000000Z",
"created_at": "2023-01-04T12:26:20.000000Z",
"updated_at": "2023-01-04T12:26:20.000000Z"
},
// ... другие пользователи
]

Пример с Пагинацией

// Controller:
public function index()
{
return User::paginate();
}

Вернёт:

{
"current_page": 1,
"data": [
{
"id": 1,
"name": "Prof. Marcos Ratke",
"email": "providenci.hane@example.org",
"email_verified_at": "2023-01-04T12:26:19.000000Z",
"created_at": "2023-01-04T12:26:20.000000Z",
"updated_at": "2023-01-04T12:26:20.000000Z"
},
{
"id": 2,
"name": "Sincere Casper",
"email": "jaylin33@example.com",
"email_verified_at": "2023-01-04T12:26:19.000000Z",
"created_at": "2023-01-04T12:26:20.000000Z",
"updated_at": "2023-01-04T12:26:20.000000Z"
},
// ... другие пользователи
],
"first_page_url": "http://laravel.test/api/users?page=1",
"from": 1,
"last_page": 2,
"last_page_url": "http://laravel.test/api/users?page=2",
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "http://laravel.test/api/users?page=1",
"label": "1",
"active": true
},
{
"url": "http://laravel.test/api/users?page=2",
"label": "2",
"active": false
},
{
"url": "http://laravel.test/api/users?page=2",
"label": "Next »",
"active": false
}
],
"next_page_url": "http://laravel.test/api/users?page=2",
"path": "http://laravel.test/api/users",
"per_page": 15,
"prev_page_url": null,
"to": 15,
"total": 20
}

Как видите, пользователи обёрнуты в data, основной JSON содержит больше данных о страницах.

Пример с Одиночной Моделью

// Controller:
public function show(User $user)
{
return $user;
}

Вернёт:

{
"id": 1,
"name": "Prof. Marcos Ratke",
"email": "providenci.hane@example.org",
"email_verified_at": "2023-01-04T12:26:19.000000Z",
"created_at": "2023-01-04T12:26:20.000000Z",
"updated_at": "2023-01-04T12:26:20.000000Z"
}

Как это работает?

Цитата из официальной документации Laravel о Сериализации:

Поскольку модели и коллекции преобразуются в JSON при преобразовании в строку, вы можете возвращать объекты Eloquent непосредственно из маршрутов или контроллеров вашего приложения. Laravel автоматически сериализует ваши модели и коллекции Eloquent в JSON, когда они возвращаются из маршрутов или контроллеров:

Ручной возврат JSON

Если вы хотите вернуть JSON из какой-либо другой не-Eloquent структуры, вы можете указать это с помощью return response()->json(), передав массив в качестве параметра:

// Controller:
public function update(UpdateUserRequest $request, User $user)
{
$user->update($request->validated());

return response()->json(['success' => true]);

Вернёт:

{
"success": true
}

Дополнительные материалы

Предыдущая Статья

CSRF: Подделка межсайтовых запросов

Следующая Статья

Laravel: Web и API — одинаковые или разные контроллеры?