Метод with
Метод with класса JsonResource применяется для включения дополнительной информации в JSON-ответ. Этот метод возвращает массив, который будет объединён с основными данными ресурса. Обычно используется для передачи метаданных, таких как сообщения об успехе, коды ошибок, информация о пагинации или дополнительные вычисляемые значения.
Синтаксис
<?php
use Illuminate\Http\Resources\Json\JsonResource;
class ExampleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
];
}
public function with($request)
{
return [
'key' => 'value',
];
}
}
?>
Пример
Давайте создадим ресурс для модели Article с дополнительными метаданными:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class ArticleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->content,
'created_at' => $this->created_at,
];
}
public function with($request)
{
return [
'success' => true,
'message' => 'Article retrieved successfully',
'timestamp' => now()->toISOString(),
];
}
}
?>
Теперь используем этот ресурс в контроллере:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use App\Http\Resources\ArticleResource;
class ArticleController extends Controller
{
public function show($id)
{
$article = Article::find($id);
if (!$article) {
return response()->json([
'success' => false,
'message' => 'Article not found',
], 404);
}
return new ArticleResource($article);
}
}
?>
Результат выполнения кода при запросе к /api/articles/1:
{
"data": {
"id": 1,
"title": "Laravel Fundamentals",
"content": "Full article content here...",
"created_at": "2026-01-15T10:30:00.000000Z"
},
"success": true,
"message": "Article retrieved successfully",
"timestamp": "2026-09-07T14:20:00.000000Z"
}
Пример
Рассмотрим использование with для добавления информации о пагинации при работе с коллекциями:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class ArticleCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => ArticleResource::collection($this->collection),
];
}
public function with($request)
{
return [
'meta' => [
'total' => $this->total(),
'per_page' => $this->perPage(),
'current_page' => $this->currentPage(),
'last_page' => $this->lastPage(),
],
'success' => true,
];
}
}
?>
Использование в контроллере:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use App\Http\Resources\ArticleCollection;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::paginate(10);
return new ArticleCollection($articles);
}
}
?>
Результат выполнения кода при запросе к /api/articles:
{
"data": [
{
"id": 1,
"title": "Laravel Fundamentals",
"content": "Full article content here...",
"created_at": "2026-01-15T10:30:00.000000Z"
},
{
"id": 2,
"title": "Eloquent Relationships",
"content": "Full article content here...",
"created_at": "2026-01-16T12:45:00.000000Z"
}
],
"meta": {
"total": 25,
"per_page": 10,
"current_page": 1,
"last_page": 3
},
"success": true
}
Смотрите также
-
метод
toArray,
который определяет структуру основных данных ресурса -
метод
additional,
который добавляет данные к ресурсу на лету -
метод
wrap,
который управляет обёрткой данных -
класс
ResourceCollection,
который используется для создания коллекций ресурсов