Метод toArray
Метод toArray класса JsonResource определяет,
какие атрибуты модели должны быть включены в ответ JSON API.
Этот метод вызывается автоматически при преобразовании ресурса
в JSON. Первым параметром метод принимает объект запроса
Request, на основе которого можно динамически изменять
состав возвращаемых данных.
Синтаксис
<?php
class Resource extends JsonResource
{
public function toArray($request)
{
return [
'key' => $this->attribute,
];
}
}
?>
Пример
Давайте создадим ресурс для модели User и определим
базовые поля для возврата:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
];
}
}
?>
Используем созданный ресурс в контроллере:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Http\Resources\UserResource;
class UserController extends Controller
{
public function show($id)
{
$user = User::find($id);
return new UserResource($user);
}
}
?>
Результат выполнения кода:
{
"data": {
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"created_at": "2024-01-15T10:30:00.000000Z"
}
}
Пример
Добавим условное поле, которое будет возвращаться только для администраторов:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'is_admin' => $this->when($request->user()->isAdmin(), $this->is_admin),
'phone' => $this->when($request->has('include_phone'), $this->phone),
];
}
}
?>
Пример
Включим в ресурс связь с другой моделью, используя вложенные ресурсы:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'author' => new UserResource($this->whenLoaded('user')),
'comments' => CommentResource::collection($this->whenLoaded('comments')),
'created_at' => $this->created_at,
];
}
}
?>
Результат выполнения кода:
{
"data": {
"id": 5,
"title": "Laravel JSON Resources",
"content": "Article content here...",
"author": {
"id": 2,
"name": "Jane Smith",
"email": "jane@example.com"
},
"comments": [
{
"id": 1,
"text": "Great article!",
"user_id": 3
}
],
"created_at": "2024-02-20T15:45:00.000000Z"
}
}
Смотрите также
-
класс
JsonResource,
базовый класс для создания API-ресурсов -
метод
with,
добавляет мета-данные к JSON-ответу -
метод
additional,
динамически добавляет данные в ресурс -
класс
ResourceCollection,
предназначен для работы с коллекциями ресурсов