Laravel: Как автоматически вернуть JSON для Eloquent
По умолчанию, 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
}