Команда make:resource
Команда make:resource создаёт новый класс ресурса в директории app/Http/Resources. Ресурс служит промежуточным слоем между моделями Eloquent и ответом API. Первым параметром передаётся имя класса ресурса. Опционально можно использовать флаг --collection для создания ресурса-коллекции. По умолчанию создаётся ресурс для одной модели.
Синтаксис
php artisan make:resource ResourceName
php artisan make:resource ResourceName --collection
Пример
Создадим ресурс для модели 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,
'updated_at' => $this->updated_at,
];
}
}
?>
Теперь используем ресурс в контроллере:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppHttpResourcesArticleResource;
class ArticleController extends Controller
{
public function show($id)
{
$article = Article::findOrFail($id);
return new ArticleResource($article);
}
}
?>
Результат выполнения кода:
{
"data": {
"id": 1,
"title": "article 1",
"content": "text",
"created_at": "2024-01-01 00:00:00",
"updated_at": "2024-01-01 00:00:00"
}
}
Пример
Создадим ресурс-коллекцию для множества моделей:
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonResourceCollection;
class ArticleCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection,
'count' => $this->collection->count(),
];
}
}
?>
Используем коллекцию в контроллере:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppHttpResourcesArticleCollection;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
return new ArticleCollection($articles);
}
}
?>
Результат выполнения кода:
{
"data": [
{
"id": 1,
"title": "article 1",
"content": "text",
"created_at": "2024-01-01 00:00:00",
"updated_at": "2024-01-01 00:00:00"
},
{
"id": 2,
"title": "article 2",
"content": "text",
"created_at": "2024-01-02 00:00:00",
"updated_at": "2024-01-02 00:00:00"
}
],
"count": 2
}
Пример
Создадим ресурс с дополнительными вычисляемыми полями:
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;
use CarbonCarbon;
class ArticleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'created_at' => $this->created_at->format('Y-m-d'),
'updated_at' => $this->updated_at->format('Y-m-d'),
'is_new' => $this->created_at->diffInDays(Carbon::now()) < 7,
'short_content' => substr($this->content, 0, 100),
];
}
}
?>
Результат выполнения кода:
{
"data": {
"id": 1,
"title": "article 1",
"content": "text",
"created_at": "2024-01-01",
"updated_at": "2024-01-01",
"is_new": true,
"short_content": "text"
}
}
Смотрите также
-
команда
make-model,
которая создаёт новую модель Eloquent -
команда
make-controller,
которая создаёт новый контроллер -
команда
make-request,
которая создаёт класс запроса для валидации -
команда
make-factory,
которая создаёт фабрику для генерации тестовых данных