API 리소스
소개
- 리소스 수집
- 개념 개요
- 리소스 수집
- 사용자 정의 기본 리소스 클래스 중첩된 리소스 래핑
- 데이터 래핑 및 페이징
- Paging
- 조건부 속성
- 조건부 병합 데이터
- 조건부 중간 테이블 정보
- 최상위 메타데이터
- 메타데이터 추가 자원을 건설할 때
- 반응형 리소스
Eloquent: API 리소스
소개
API를 구축할 때 연결을 위한 변환 레이어가 필요한 경우가 많습니다. 모델과 실제 JSON 응답이 사용자에게 반환됩니다. Laravel의 리소스 클래스를 사용하면 보다 직관적이고 쉬운 방법으로 모델과 모델 컬렉션을 JSON으로 변환할 수 있습니다.
리소스 생성
make:resource
Artisan 명령을 사용하여 리소스 클래스를 생성할 수 있습니다. 기본적으로 생성된 리소스는 애플리케이션의app/Http/Resources
폴더에 배치됩니다. 리소스는IlluminateHttpResourcesJsonJsonResource
클래스에서 상속됩니다.make:resource
Artisan 命令来生成一个资源类。默认情况下生成的资源都会被放置在应用程序的app/Http/Resources
文件夹下。资源继承自IlluminateHttpResourcesJsonJsonResource
类:php artisan make:resource User
资源集合
除了生成资源转换单个模型外,你还可以生成资源集合用来转换模型的集合。这允许你在响应中包含与给定资源相关的链接与其他元信息。
你需要在生成资源时添加
--collection
标志以生成一个资源集合。或者,你也可以直接在资源的名称中包含Collection
向 Laravel 表示应该生成一个资源集合。资源集合继承自IlluminateHttpResourcesJsonResourceCollection
类:php artisan make:resource Users --collection php artisan make:resource UserCollection
概念综述
{tip} 这是对资源和资源集合的高度概述。强烈建议你阅读本文档的其他部分,以深入了解如何更好地自定义和使用资源。
在深入了解如何定制化编写你的资源之前,让我们先来看看在 Laravel 中如何使用资源。一个资源类表示一个单一模型需要被转换成 JSON 格式。例如,现在我们有一个简单的
User
资源类:<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 将资源转换成数组。 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
每一个资源类都定义了一个
toArray
方法,在发送响应时它会返回应该被转化成 JSON 的属性数组。注意在这里我们可以直接使用$this
变量来访问模型属性。这是因为资源类将自动代理属性和方法到底层模型以方便访问。你可以在路由或控制器中返回已定义的资源:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return new UserResource(User::find(1)); });
资源集合
你可以在路由或者控制器中使用
collection
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()); });
리소스 컬렉션
단일 모델을 변환하기 위한 리소스를 생성하는 것 외에도 모델 컬렉션을 변환하기 위한 리소스 컬렉션을 생성할 수도 있습니다. . 이를 통해 응답에 특정 리소스와 관련된 링크 및 기타 메타정보를 포함할 수 있습니다. 🎜🎜리소스 컬렉션을 생성하려면 리소스 생성 시--collection
플래그를 추가해야 합니다. 또는 리소스 이름에Collection
을 직접 포함하여 리소스 컬렉션이 생성되어야 함을 Laravel에 표시할 수 있습니다. 리소스 컬렉션은IlluminateHttpResourcesJsonResourceCollection
클래스에서 상속됩니다: 🎜php artisan make:resource UserCollection
🎜🎜🎜🎜개념 개요🎜🎜{tip} 이것은 리소스 및 리소스에 대한 높은 수준의 개요입니다. 자원 수집 . 리소스를 더 잘 사용자 정의하고 사용하는 방법에 대한 통찰력을 얻으려면 이 문서의 다른 섹션을 읽는 것이 좋습니다. 🎜
🎜리소스를 사용자 정의하는 방법을 알아보기 전에 먼저 Laravel에서 리소스를 사용하는 방법을 살펴보겠습니다. 리소스 클래스는 JSON 형식으로 변환해야 하는 단일 모델을 나타냅니다. 예를 들어, 이제 간단한User
리소스 클래스가 있습니다. 🎜<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * 将资源集合转换成数组。 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => $this->collection, 'links' => [ 'self' => 'link-value', ], ]; } }
🎜모든 리소스 클래스는 응답을 JSON 속성으로 보낼 때 변환해야 하는 항목을 반환하는toArray
메서드를 정의합니다. 정렬. 여기서는$this
변수를 직접 사용하여 모델 속성에 액세스할 수 있습니다. 이는 리소스 클래스가 쉽게 액세스할 수 있도록 속성과 메서드를 기본 모델에 자동으로 프록시하기 때문입니다. 경로나 컨트롤러에서 정의된 리소스를 반환할 수 있습니다. 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::all()); });
리소스 컬렉션
🎜 경로나 컨트롤러에서collection
메서드를 사용하여 리소스 인스턴스를 생성할 수 있습니다. 또는 페이지가 매겨진 응답: 🎜<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 指示是否应保留资源的集合键。 * * @var bool */ public $preserveKeys = true; }
물론, 위의 방법을 사용하면 추가 메타데이터를 추가하고 컬렉션과 함께 반환할 수 없습니다. 사용자 정의 리소스 컬렉션 응답이 필요한 경우 컬렉션을 나타내는 전용 리소스를 생성해야 합니다.
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()->keyBy->id); });
생성된 리소스 컬렉션 클래스의 응답으로 반환하려는 메타데이터를 쉽게 정의할 수 있습니다.
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * collects 属性定义了资源类。 * * @var string */ public $collects = 'App\Http\Resources\Member'; }
반환할 수 있습니다. 라우트 또는 컨트롤러에 정의된 리소스 컬렉션:
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 将资源转换成数组。 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; } }
컬렉션 키 보호
라우트에서 리소스 컬렉션을 반환할 때 Laravel은 컬렉션의 키가 간단한 숫자 순서로 재설정되도록 합니다. 그러나
preserveKeys
속성을 리소스 클래스에 추가하여 컬렉션 키를 보존해야 하는지 여부를 나타낼 수 있습니다.preserveKeys
属性添加到资源类中,指示是否应保留集合键:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return new UserResource(User::find(1)); });
当
preserveKeys
属性被设置为true
, 集合的键将会被保护:/** * 将资源转换成数组。 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'posts' => PostResource::collection($this->posts), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }
自定义基础资源类
通常,资源集合的
$this->collection
属性会自动填充,结果是将集合的每个项映射到其单个资源类。假定单一资源类是集合的类名,但结尾没有Collection
字符串。例如,
UserCollection
将给定的用户实例映射到User
资源中。若要自定义此行为,你可以重写资源集合的$collects
属性:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()); });
编写资源
{tip} 如果你还没有阅读 概念综述,那么在继续阅读本文档前,强烈建议你去阅读一下。
从本质上来说,资源的作用很简单。它们只需要将一个给定的模型转换成一个数组。所以每一个资源都包含一个
toArray
方法用来将你的模型属性转换成一个可以返回给用户的 API 友好数组:<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * 将资源集合转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'data' => $this->collection, 'links' => [ 'self' => 'link-value', ], ]; } }
你可以在路由或者控制器中返回已经定义的资源:
use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::all()); });
关联
如果你希望在响应中包含关联资源,你只需要将它们添加到
toArray
方法返回的数组中。在下面这个例子里,我们将使用Post
资源的collection
方法将用户的文章添加到资源响应中:{ "data": [ { "id": 1, "name": "Eladio Schroeder Sr.", "email": "therese28@example.com", }, { "id": 2, "name": "Liliana Mayert", "email": "evandervort@example.com", } ] }
{tip} 如果你只想在关联已经加载时才添加关联资源,请查看文档 条件关联 。
资源集合
资源是将单个模型转换成数组,而资源集合是将多个模型的集合转换成数组。所有的资源都提供了一个
collection
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Http\Resources\Json\Resource; class AppServiceProvider extends ServiceProvider{ /** * 在注册后进行服务的启动 * * @return void */ public function boot() { Resource::withoutWrapping(); } /** * 在容器中注册绑定 * * @return void */ public function register() { // } }
preserveKeys
속성이true로 설정된 경우
, 컬렉션의 키가 보호됩니다:<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class CommentsCollection extends ResourceCollection{ /** * 将资源集合转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return ['data' => $this->collection]; } }
Custom 기본 리소스 클래스일반적으로 리소스 컬렉션의$this->collection
속성은 자동으로 채워지며, 그 결과 컬렉션의 각 항목이 개별 리소스 클래스에 매핑됩니다. 단일 리소스 클래스는 컬렉션의 클래스 이름으로 간주되지만 끝에Collection
문자열이 없습니다.{ "data": [ { "id": 1, "name": "Eladio Schroeder Sr.", "email": "therese28@example.com", }, { "id": 2, "name": "Liliana Mayert", "email": "evandervort@example.com", } ], "links":{ "first": "http://example.com/pagination?page=1", "last": "http://example.com/pagination?page=1", "prev": null, "next": null }, "meta":{ "current_page": 1, "from": 1, "last_page": 1, "path": "http://example.com/pagination", "per_page": 15, "to": 10, "total": 10 } }
🎜🎜Writing Resources
< blockquote >🎜{tip} 개념 개요🎜를 아직 읽지 않으셨다면, 이 문서를 계속 읽기 전에 먼저 읽어 보시기를 적극 권장합니다. 🎜🎜본질적으로 리소스의 역할은 간단합니다. 주어진 모델을 배열로 변환하기만 하면 됩니다. 따라서 모든 리소스에는 모델 속성을 사용자에게 반환할 수 있는 API 친화적인 배열로 변환하는toArray
메서드가 포함되어 있습니다. 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::paginate()); });
🎜경로나 컨트롤러에서 정의된 항목을 반환할 수 있습니다. 리소스: 🎜{ "data": [ { "id": 1, "name": "Eladio Schroeder Sr.", "email": "therese28@example.com", }, { "id": 2, "name": "Liliana Mayert", "email": "evandervort@example.com", } ], "links":{ "first": "http://example.com/pagination?page=1", "last": "http://example.com/pagination?page=1", "prev": null, "next": null }, "meta":{ "current_page": 1, "from": 1, "last_page": 1, "path": "http://example.com/pagination", "per_page": 15, "to": 10, "total": 10 } }
🎜 연결🎜🎜응답에 관련 리소스를 포함하려면toArray
메서드에서 반환된 배열에 해당 리소스를 추가하기만 하면 됩니다. 다음 예에서는Post
리소스의collection
메서드를 사용하여 사용자의 게시물을 리소스 응답에 추가합니다. 🎜/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'secret' => $this->when(Auth::user()->isAdmin(), 'secret-value'), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }
🎜{tip} 연결이 로드될 때만 연결된 리소스를 추가하려면 조건부 연결에 대한 설명서를 참조하세요. 🎜
🎜리소스 컬렉션🎜🎜리소스는 단일 모델을 배열로 변환하고, 리소스 컬렉션은 여러 모델 모음을 배열로 변환합니다. 모든 리소스는 "임시" 리소스 컬렉션을 생성하기 위한collection
메서드를 제공하므로 각 모델 유형에 대한 리소스 컬렉션 클래스를 작성할 필요가 없습니다. 🎜'secret' => $this->when(Auth::user()->isAdmin(), function () { return 'secret-value'; }),
🎜그러나 필요한 경우 반환된 컬렉션의 메타데이터인 경우에도 리소스 컬렉션을 정의해야 합니다. 🎜/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, $this->mergeWhen(Auth::user()->isAdmin(), [ 'first-secret' => 'value', 'second-secret' => 'value', ]), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }
🎜 단일 리소스처럼 경로나 컨트롤러에서 리소스 컬렉션을 직접 반환할 수 있습니다. 🎜/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, 'posts' => PostResource::collection($this->whenLoaded('posts')), 'created_at' => $this->created_at, 'updated_at' => $this->updated_at, ]; }
🎜🎜🎜🎜데이터 래핑
기본적으로 리소스 응답이 JSON으로 변환되면 최상위 리소스가
data
키에 래핑됩니다. 따라서 일반적인 리소스 수집 응답은 다음과 같습니다.data
键中。因此一个典型的资源集合响应如下所示:/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'expires_at' => $this->whenPivotLoaded('role_user', function () { return $this->pivot->expires_at; }), ]; }
你可以使用资源基类的
withoutWrapping
方法来禁用顶层资源的包裹。通常,你应该在AppServiceProvider
或其他在程序每一个请求中都会被加载的 服务提供者 中调用此方法:/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'id' => $this->id, 'name' => $this->name, 'expires_at' => $this->whenPivotLoadedAs('subscription', 'role_user', function () { return $this->subscription->expires_at; }), ]; }
{note}
withoutWrappin
方法只会禁用顶层资源的包裹,不会删除你手动添加到资源集合中的data
键。包裹嵌套资源
你可以完全自由地决定资源关联如何被包裹。如果你希望无论怎样嵌套,都将所有资源集合包裹在
data
键中,那么你需要为每个资源都定义一个资源集合类,并将返回的集合包裹在data
键中。当然,你可能会担心这样顶层资源将会被包裹在两个
data
键中。请放心, Laravel 将永远不会让你的资源被双层包裹,因此你不必担心被转换的资源集合会被多重嵌套:/** * 将资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request){ return [ 'data' => $this->collection, 'links' => [ 'self' => 'link-value', ], ]; }
数据包裹和分页
当在资源响应中返回分页集合时,即使你调用了
withoutWrapping
方法, Laravel 也会将你的资源数据包裹在data
键中。这是因为分页响应中总会有meta
和links
键包含着分页状态信息:<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * 将资源集合转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return parent::toArray($request); } /** * 返回应该和资源一起返回的其他数据数组 * * @param \Illuminate\Http\Request $request * @return array */ public function with($request) { return [ 'meta' => [ 'key' => 'value', ], ]; } }
分页
你可以将分页实例传递给资源的
collection
方法或者自定义的资源集合:return (new UserCollection(User::all()->load('roles'))) ->additional(['meta' => [ 'key' => 'value', ] ]);
分页响应中总有
meta
和links
键包含着分页状态信息:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return new UserResource(User::find(1)); });
条件属性
有些时候,你可能希望在给定条件满足时添加属性到资源响应里。例如,你可能希望如果当前用户是 「管理员」 时添加某个值到资源响应中。在这种情况下 Laravel 提供了一些辅助方法来帮助你解决问题。
when
方法可以被用来有条件地向资源响应添加属性:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return (new UserResource(User::find(1))) ->response() ->header('X-Value', 'True'); });
在上面这个例子中,只有当
isAdmin
方法返回true
时,secret
键才会最终在资源响应中被返回。如果该方法返回false
,则secret
键将会在资源响应被发送给客户端之前被删除。when
方法可以使你避免使用条件语句拼接数组,转而用更优雅的方式来编写你的资源。when
方法也接受闭包作为其第二个参数,只有在给定条件为true
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 资源转换成数组 * * @param \Illuminate\Http\Request $request * @return array */ public function toArray($request) { return [ 'id' => $this->id, ]; } /** * 自定义响应 * * @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Response $response * @return void */ public function withResponse($request, $response) { $response->header('X-Value', 'True'); } }
리소스 기본 클래스의withoutWrapping
메서드를 사용하여 최상위 리소스 래핑을 비활성화할 수 있습니다. 일반적으로 프로그램의 모든 요청 시 로드되는AppServiceProvider
또는 기타 서비스 제공자에서 이 메서드를 호출해야 합니다. 🎜rrreee🎜{note}
🎜중첩 리소스 래핑🎜🎜리소스 연결 래핑 방법을 완전히 자유롭게 결정할 수 있습니다. 모든 리소스 컬렉션을 중첩 여부에 관계없이withoutWrappin
이 메서드 최상위 리소스의 래핑만 비활성화하고 리소스 컬렉션에 수동으로 추가한data
키는 삭제하지 않습니다. 🎜data
키로 래핑하려면 각 리소스에 대한 리소스 컬렉션 클래스를 정의하고 반환된 컬렉션을data에서 래핑해야 합니다. 코드> 키. 🎜🎜물론 최상위 리소스가 두 개의
data
키에 래핑될까 봐 걱정할 수도 있습니다. 안심하십시오. Laravel은 리소스를 이중으로 포장하지 않으므로 변환된 리소스 컬렉션이 다중 중첩되는 것에 대해 걱정할 필요가 없습니다. 🎜rrreee 🎜 데이터 래핑 및 페이지 매김 🎜🎜 리소스 응답에서 페이지가 매겨진 컬렉션을 반환할 때 ,withoutWrapping
메소드를 호출하더라도 Laravel은 리소스 데이터를data
키에 래핑합니다. 이는 페이지 매김 상태 정보를 포함하는 페이지 매김 응답에 항상meta
및links
키가 있기 때문입니다: 🎜rrreee🎜🎜🎜 페이지 매김🎜🎜페이지 매김 인스턴스를 리소스의컬렉션
메서드 또는 사용자 정의 리소스 컬렉션에 전달할 수 있습니다. 🎜rrreee🎜페이지 매김에는 항상메타
및링크<가 있습니다. 응답 /code> 키에는 페이지 매김 상태 정보가 포함되어 있습니다: 🎜rrreee🎜🎜🎜Conditional attribute🎜🎜때때로 주어진 조건이 충족될 때 리소스 응답에 속성을 추가하고 싶을 수도 있습니다. 안에서 만나요. 예를 들어 현재 사용자가 "관리자"인 경우 리소스 응답에 값을 추가할 수 있습니다. 이 경우 Laravel은 문제 해결에 도움이 되는 몇 가지 도우미 메서드를 제공합니다.
메서드: 🎜rrreee🎜🎜when
메서드를 사용하면 리소스 응답에 조건부로 속성을 추가할 수 있습니다. 🎜rrreee🎜위 예에서는isAdmin
메서드가true
,secret
키는 최종적으로 리소스 응답으로 반환됩니다. 이 메서드가false
를 반환하면 리소스 응답이 클라이언트에 전송되기 전에secret
키가 삭제됩니다.when
메서드를 사용하면 배열을 조건문과 연결하는 것을 방지하고 대신 리소스를 보다 우아한 방식으로 작성할 수 있습니다. 🎜🎜when
메소드는 클로저를 두 번째 매개변수로 허용하며 반환된 값은 주어진 조건이true
인 경우에만 클로저에서 계산됩니다. 🎜rrreee조건부 데이터 병합
때로는 주어진 조건이 충족될 때 리소스 응답에 여러 속성을 추가하고 싶을 수도 있습니다. 이 경우, 주어진 조건이
rrreeetrue
일 때mergeWhen
메서드를 사용하여 응답에 여러 속성을 추가할 수 있습니다.mergeWhen
方法在给定的条件为true
时将多个属性添加到响应中:同理,如果给定的条件为
false
时,则这些属性将会在资源响应被发送给客户端之前被移除。{note}
mergeWhen
方法不应该被使用在混合字符串和数字键的数组中。此外,它也不应该被使用在不按顺序排列的数字键的数组中。条件关联
除了有条件地添加属性之外,你还可以根据模型关联是否已加载来有条件地在你的资源响应中包含关联。这允许你在控制器中决定加载哪些模型关联,这样你的资源可以在模型关联被加载后才添加它们。
这样做可以避免在你的资源中出现 「N+1」 查询问题。你应该使用
rrreeewhenLoaded
方法来有条件的加载关联。为了避免加载不必要的关联,此方法接受关联的名称而不是关联本身作为其参数:在上面这个例子中,如果关联没有被加载,则
posts
键将会在资源响应被发送给客户端之前被删除。条件中间表信息
除了在你的资源响应中有条件地包含关联外,你还可以使用
rrreeewhenPivotLoaded
方法有条件地从多对多关联的中间表中添加数据。whenPivotLoaded
方法接受的第一个参数为中间表的名称。第二个参数是一个闭包,它定义了在模型上如果中间表信息可用时要返回的值:如果你的中间表使用的是
rrreeepivot
以外的访问器,你可以使用whenPivotLoadedAs
方法:添加元数据
一些 JSON API 标准需要你在资源和资源集合响应中添加元数据。这通常包括资源或相关资源的
rrreeelinks
,或一些关于资源本身的元数据。如果你需要返回有关资源的其他元数据,只需要将它们包含在toArray
方法中即可。例如在转换资源集合时你可能需要添加links
信息:当添加额外的元数据到你的资源中时,你不必担心会覆盖 Laravel 在返回分页响应时自动添加的
마찬가지로, 지정된 조건이 다음과 같을 때links
或meta
键。你添加的任何其他links
会与分页响应添加的links
rrreeefalse
인 경우 리소스 응답이 클라이언트에 전송되기 전에 이러한 속성이 제거됩니다. 🎜🎜{note} 문자열과 숫자 키가 혼합된 배열에는
🎜🎜mergeWhen
메서드를 사용하면 안 됩니다. 또한 비순차적 숫자 키 배열에는 사용하면 안 됩니다. 🎜조건부 관계
🎜조건부로 속성을 추가하는 것 외에도 모델 관계가 다음과 같은지 여부에 따라 속성을 추가할 수도 있습니다. 리소스 응답에 조건부로 연결을 포함합니다. 이를 통해 어떤 모델 연결이 로드되는지 컨트롤러에서 결정할 수 있으므로 리소스는 모델 연결이 로드된 후에만 모델 연결을 추가할 수 있습니다. 🎜🎜이렇게 하면 리소스에서 "N+1" 쿼리 문제를 피할 수 있습니다. 연결을 조건부로 로드하려면whenLoaded
메서드를 사용해야 합니다. 불필요한 연결 로드를 방지하기 위해 이 메소드는 연결 자체 대신 연결 이름을 매개변수로 허용합니다. 🎜rrreee🎜위 예에서 연결이 로드되지 않으면posts
키가 in 리소스 응답은 클라이언트에 전송되기 전에 삭제됩니다. 🎜🎜조건부 중간 테이블 정보🎜🎜리소스 응답에 연결을 조건부로 포함하는 것 외에도whenPivotLoaded
메서드를 사용하여 다대다 연결의 중간 테이블에서 조건부로 데이터를 추가할 수도 있습니다. .whenPivotLoaded
메서드에서 허용하는 첫 번째 매개변수는 중간 테이블의 이름입니다. 두 번째 매개변수는 모델에서 중간 테이블 정보를 사용할 수 있는 경우 반환할 값을 정의하는 클로저입니다. 🎜rrreee🎜 중간 테이블이pivot
이외의 접근자를 사용하는 경우 < code>whenPivotLoadedAs메타데이터 추가
🎜일부 JSON API 표준에서는 리소스에 메타데이터를 추가하고 자원 수집 응답. 여기에는 일반적으로 리소스나 관련 리소스에 대한링크
또는 리소스 자체에 대한 일부 메타데이터가 포함됩니다. 리소스에 대한 추가 메타데이터를 반환해야 하는 경우 해당 메타데이터를toArray
메서드에 포함하면 됩니다. 예를 들어 리소스 모음을 변환할 때링크
정보를 추가해야 할 수 있습니다: 🎜rrreee🎜 리소스에 추가 메타데이터를 추가할 때 Laravel이 리소스를 반환할 때 자동으로 추가하는 것을 덮어쓰는 것에 대해 걱정할 필요가 없습니다. 페이지가 매겨진 응답링크
또는메타
키. 추가한 다른 모든링크
는 페이지를 매긴 응답에 의해 추가된링크
와 병합됩니다. 🎜최상위 메타데이터
리소스가 최상위 리소스로 반환될 때 리소스 응답에 일부 메타데이터를 추가해야 하는 경우가 있습니다. 여기에는 일반적으로 전체 응답에 대한 메타 정보가 포함됩니다. 메타데이터를 정의하기 위해 리소스 클래스에
rrreeewith
메소드를 추가할 수 있습니다. 이 메소드는 리소스가 최상위 리소스로 렌더링될 때 리소스 응답에 포함될 메타데이터 배열을 반환해야 합니다.with
方法来定义元数据。此方法应返回一个元数据数组,当资源被作为顶层资源渲染时,这个数组将会被包含在资源响应中:构造资源时添加元数据
你还可以在路由或者控制器中构造资源实例时添加顶层数据。所有资源都可以使用
rrreeeadditional
方法来接受应该被添加到资源响应中的数据数组:响应资源
就像你知道的那样, 资源可以直接在路由和控制器中被返回:
rrreee但有些时候,在发送给客户端前你可能需要自定义 HTTP 响应。 你有两种办法。第一,你可以在链式上调用
rrreeeresponse
方法。此方法将会返回IlluminateHttpResponse
实例,允许你自定义响应头信息:另外,你还可以在资源中定义一个
리소스 구성 시 메타데이터 추가withResponse
rrreee