РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
512 of 1392 menu

Метод additional

Метод additional класса JsonResource позволяет добавлять произвольные мета-данные к финальному JSON-ответу ресурса. Эти данные помещаются в корневой объект ответа наряду с основными данными ресурса. Метод принимает один параметр - массив с дополнительными данными, которые будут включены в ответ.

Синтаксис

<?php use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, ]; } public function with($request) { return [ 'meta' => [ 'version' => '1.0.0', ], ]; } } ?>

Альтернативно, можно использовать метод additional в контроллере при создании ресурса:

<?php use App\Http\Resources\UserResource; use App\Models\User; $user = User::find(1); $res = (new UserResource($user)) ->additional(['meta' => ['version' => '1.0.0']]); ?>

Пример

Давайте создадим ресурс для модели User и добавим к нему дополнительную информацию о версии API и статусе ответа:

<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Request; class UserResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, ]; } public function with(Request $request): array { return [ 'api_version' => 'v2.0.0', 'status' => 'success', ]; } } ?>

Теперь используем этот ресурс в контроллере:

<?php namespace App\Http\Controllers; use App\Models\User; use App\Http\Resources\UserResource; use Illuminate\Http\Request; class UserController extends Controller { public function show(Request $request, $id) { $user = User::find($id); $res = new UserResource($user); return $res; } } ?>

Результат выполнения кода при запросе к эндпоинту:

{ "id": 1, "name": "John Doe", "email": "john@example.com", "api_version": "v2.0.0", "status": "success" }

Пример

Используем метод additional динамически в контроллере для добавления разных мета-данных в зависимости от условий:

<?php namespace App\Http\Controllers; use App\Models\Article; use App\Http\Resources\ArticleResource; use Illuminate\Http\Request; class ArticleController extends Controller { public function index(Request $request) { $articles = Article::all(); $res = ArticleResource::collection($articles) ->additional([ 'meta' => [ 'total' => $articles->count(), 'request_time' => microtime(true), 'authorized' => $request->user() ? true : false, ], ]); return $res; } } ?>

Результат выполнения кода:

{ "data": [ { "id": 1, "title": "First Article", "content": "Content of first article" }, { "id": 2, "title": "Second Article", "content": "Content of second article" } ], "meta": { "total": 2, "request_time": 1644324321.1234, "authorized": true } }

Пример

Совмещаем метод additional с методом wrap для управления обёрткой ответа:

<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Request; class PostResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'title' => $this->title, 'excerpt' => substr($this->content, 0, 50), ]; } public function with(Request $request): array { return [ 'server_time' => now()->toDateTimeString(), 'api_version' => 'v3.0.0', ]; } } ?>

В контроллере добавляем обёртку и дополнительные данные:

<?php namespace App\Http\Controllers; use App\Models\Post; use App\Http\Resources\PostResource; use Illuminate\Http\Request; class PostController extends Controller { public function show(Request $request, $id) { $post = Post::find($id); $res = (new PostResource($post)) ->additional([ 'pagination' => [ 'prev' => $id > 1 ? $id - 1 : null, 'next' => $id < 10 ? $id + 1 : null, ], ]) ->wrap('post'); return $res; } } ?>

Результат выполнения кода:

{ "post": { "id": 5, "title": "Fifth Post", "excerpt": "This is the excerpt of the fifth post..." }, "server_time": "2024-01-15 14:30:25", "api_version": "v3.0.0", "pagination": { "prev": 4, "next": 6 } }

Смотрите также

  • метод toArray,
    который определяет структуру данных ресурса
  • метод with,
    который добавляет мета-данные из самого ресурса
  • метод wrap,
    который управляет обёрткой данных ресурса
  • класс JsonResponse,
    который формирует JSON-ответ в Laravel
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить