Класс JsonResource
Класс JsonResource применяется для формирования JSON-ответов
в Laravel. Он преобразует Eloquent-модели и коллекции в
структурированный JSON, позволяя управлять форматом данных
в едином месте. Ресурсы содержат метод toArray,
который определяет структуру выходных данных. Первым параметром
в метод toArray передаётся объект Request,
который позволяет учитывать контекст запроса при формировании ответа.
Синтаксис
<?php
class ResourceName extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
];
}
}
?>
Пример
Давайте создадим ресурс для модели Article:
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;
class ArticleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'created_at' => $this->created_at,
];
}
}
?>
Пример
Теперь используем ресурс в контроллере для возврата одной записи:
<?php
namespace AppHttpControllers;
use AppHttpResourcesArticleResource;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function show($id)
{
$article = Article::find($id);
return new ArticleResource($article);
}
}
?>
Результат выполнения кода:
{
"data": {
"id": 1,
"title": "article 1",
"content": "text",
"created_at": "2026-01-01T10:00:00.000000Z"
}
}
Пример
Для возврата коллекции используйте статический метод collection:
<?php
namespace AppHttpControllers;
use AppHttpResourcesArticleResource;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
return ArticleResource::collection($articles);
}
}
?>
Результат выполнения кода:
{
"data": [
{
"id": 1,
"title": "article 1",
"content": "text",
"created_at": "2026-01-01T10:00:00.000000Z"
},
{
"id": 2,
"title": "article 2",
"content": "text",
"created_at": "2026-01-02T10:00:00.000000Z"
}
]
}
Пример
Ресурс может включать связанные данные через отношения модели:
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;
class ArticleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'author' => new UserResource($this->whenLoaded('user')),
'created_at' => $this->created_at,
];
}
}
?>
Метод whenLoaded добавляет отношение только если
оно было загружено через with в запросе.
Смотрите также
-
метод
toArray,
который определяет структуру данных ресурса -
метод
with,
который добавляет дополнительные данные к ответу -
метод
additional,
который добавляет мета-данные к ресурсу -
класс
ResourceCollection,
который используется для трансформации коллекций