sumber API
Pengenalan
- Koleksi Sumber
- Tinjauan Konsep Kelas sumber asas tersuai
- Pembungkusan data dan paging
- Paging
- Sumber responsif
Fasih: sumber API
- Pengenalan
- Menjana sumber
- Gambaran keseluruhan konsep
- Respon Sumber
Apabila membina API, anda sering memerlukan lapisan transformasi untuk menghubungkan anda The Eloquent model dan respons JSON sebenar dikembalikan kepada pengguna. Kelas sumber Laravel membolehkan anda menukar model dan koleksi model kepada JSON dengan cara yang lebih intuitif dan mudah.
Anda boleh menggunakan perintah
make:resource
Artisan untuk menjana kelas sumber. Secara lalai, sumber yang dijana akan diletakkan dalam folderapp/Http/Resources
aplikasi. Sumber diwarisi daripada kelasIlluminateHttpResourcesJsonJsonResource
:php artisan make:resource User
Koleksi Sumber
Selain menjana sumber untuk menukar model tunggal, anda juga boleh menjana koleksi sumber untuk menukar koleksi model . Ini membolehkan anda memasukkan pautan dan maklumat meta lain yang berkaitan dengan sumber yang diberikan dalam respons.
make:resource
Artisan 命令来生成一个资源类。默认情况下生成的资源都会被放置在应用程序的app/Http/Resources
文件夹下。资源继承自IlluminateHttpResourcesJsonJsonResource
类:php artisan make:resource Users --collection php artisan make:resource UserCollection
资源集合
除了生成资源转换单个模型外,你还可以生成资源集合用来转换模型的集合。这允许你在响应中包含与给定资源相关的链接与其他元信息。
你需要在生成资源时添加
--collection
标志以生成一个资源集合。或者,你也可以直接在资源的名称中包含Collection
向 Laravel 表示应该生成一个资源集合。资源集合继承自IlluminateHttpResourcesJsonResourceCollection
类:<?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, ]; } }
概念综述
{tip} 这是对资源和资源集合的高度概述。强烈建议你阅读本文档的其他部分,以深入了解如何更好地自定义和使用资源。
在深入了解如何定制化编写你的资源之前,让我们先来看看在 Laravel 中如何使用资源。一个资源类表示一个单一模型需要被转换成 JSON 格式。例如,现在我们有一个简单的
User
资源类:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return new UserResource(User::find(1)); });
每一个资源类都定义了一个
toArray
方法,在发送响应时它会返回应该被转化成 JSON 的属性数组。注意在这里我们可以直接使用$this
变量来访问模型属性。这是因为资源类将自动代理属性和方法到底层模型以方便访问。你可以在路由或控制器中返回已定义的资源:use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()); });
资源集合
你可以在路由或者控制器中使用
Anda perlu menambah benderacollection
--collection
semasa menjana sumber untuk menjana koleksi sumber. Sebagai alternatif, anda boleh terus memasukkanCollection
dalam nama sumber untuk menunjukkan kepada Laravel bahawa koleksi sumber harus dijana. Koleksi sumber mewarisi daripada kelasIlluminateHttpResourcesJsonResourceCollection
: 🎜php artisan make:resource UserCollection
🎜🎜🎜🎜Concept overview🎜🎜{tip} Ini ialah gambaran keseluruhan sumber dan peringkat tinggi koleksi sumber. Anda amat disyorkan untuk membaca bahagian lain dalam dokumen ini untuk mendapatkan pandangan tentang cara menyesuaikan dan menggunakan sumber dengan lebih baik. 🎜
🎜Sebelum kita mendalami cara menulis sumber anda tersuai, mari kita lihat dahulu cara menggunakan sumber dalam Laravel. Kelas sumber mewakili satu model yang perlu ditukar kepada format JSON. Sebagai contoh, kini kita mempunyai kelas sumberUser
yang mudah: 🎜<?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', ], ]; } }
🎜Setiap kelas sumber mentakrifkan kaedahtoArray
yang mengembalikan perkara yang harus ditukar apabila menghantar respons kepada atribut JSON tatasusunan. Perhatikan di sini bahawa kita boleh terus menggunakan pembolehubah$this
untuk mengakses sifat model. Ini kerana kelas sumber akan secara automatik memproksi sifat dan kaedah kepada model asas untuk akses mudah. Anda boleh mengembalikan sumber yang ditakrifkan dalam laluan atau pengawal: 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::all()); });
Koleksi Sumber
🎜Anda boleh menggunakan kaedahkoleksi
dalam laluan atau pengawal untuk membuat kejadian sumber atau respons bernombor: 🎜<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 指示是否应保留资源的集合键。 * * @var bool */ public $preserveKeys = true; }
Sudah tentu, menggunakan kaedah di atas anda tidak akan dapat menambah sebarang metadata tambahan dan mengembalikannya bersama koleksi. Jika anda memerlukan respons koleksi sumber tersuai, anda perlu mencipta sumber khusus untuk mewakili koleksi:
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()->keyBy->id); });
Anda boleh mentakrifkan mana-mana metadata yang ingin anda pulangkan dengan mudah dalam respons dalam kelas pengumpulan sumber yang dijana:
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * collects 属性定义了资源类。 * * @var string */ public $collects = 'App\Http\Resources\Member'; }
Anda boleh kembali koleksi sumber yang ditentukan dalam laluan atau pengawal:
<?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, ]; } }
Lindungi kunci koleksi
Apabila mengembalikan koleksi sumber daripada laluan, Laravel akan menetapkan semula kunci koleksi supaya ia berada dalam susunan berangka yang mudah. Walau bagaimanapun, atribut
preserveKeys
boleh ditambah pada kelas sumber untuk menunjukkan sama ada kunci koleksi harus dipelihara: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() { // } }
Apabila atributpreserveKeys
ditetapkan kepadatrue
, kunci koleksi akan dilindungi:<?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]; } }
Kelas sumber asas tersuaiBiasanya, atribut$this->collection
koleksi sumber akan diisi secara automatik dan hasilnya ialah setiap item koleksi Peta kepada kelas sumber individunya. Kelas sumber tunggal diandaikan sebagai nama kelas koleksi, tetapi tidak mempunyai rentetanCollection
pada penghujungnya.{ "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 } }
🎜🎜Sumber Penulisan
< petikan sekat >🎜{tip} Jika anda belum membaca Concept Overview🎜, maka saya amat mengesyorkan anda membacanya sebelum meneruskan membaca dokumen ini. 🎜🎜Pada dasarnya, peranan sumber adalah mudah. Mereka hanya perlu menukar model yang diberikan kepada tatasusunan. Jadi setiap sumber mengandungi kaedahtoArray
yang menukar sifat model anda kepada tatasusunan mesra API yang boleh dikembalikan kepada pengguna: 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::paginate()); });
🎜Anda boleh mengembalikan yang ditentukan dalam laluan atau pengawal Sumber: 🎜{ "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 } }
🎜 Persatuan🎜🎜Jika anda ingin memasukkan sumber yang berkaitan dalam respons, anda hanya menambahnya pada tatasusunan yang dikembalikan melalui kaedahtoArray
. Dalam contoh berikut, kami akan menggunakan kaedahkoleksi
sumberPost
untuk menambah catatan pengguna pada respons sumber: 🎜/** * 将资源转换成数组 * * @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} Jika anda hanya Untuk menambah sumber yang berkaitan hanya apabila perkaitan dimuatkan, lihat dokumentasi tentang perkaitan bersyarat. 🎜
🎜Koleksi Sumber🎜🎜Sumber menukar satu model kepada tatasusunan, manakala koleksi sumber menukarkan koleksi berbilang model kepada tatasusunan. Semua sumber menyediakan kaedahkoleksi untuk menjana koleksi sumber "sementara", jadi anda tidak perlu menulis kelas koleksi sumber untuk setiap jenis model: 🎜 'secret' => $this->when(Auth::user()->isAdmin(), function () { return 'secret-value'; }),
🎜Walau bagaimanapun, jika anda perlu Untuk menentukan metadata koleksi yang dikembalikan, anda masih perlu mentakrifkan koleksi sumber: 🎜/** * 将资源转换成数组 * * @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, ]; }
🎜 Seperti satu sumber, anda boleh terus mengembalikan koleksi sumber dalam laluan atau pengawal: 🎜/** * 将资源转换成数组 * * @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, ]; }
🎜🎜🎜🎜Pembungkusan Data
Secara lalai, apabila respons sumber ditukar kepada JSON, sumber peringkat atas akan dibalut dengan kunci
data
. Jadi tindak balas pengumpulan sumber biasa kelihatan seperti ini: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'); } }
Anda boleh melumpuhkan pembungkusan sumber peringkat atas menggunakan kaedahtanpa Bungkus
kelas asas sumber. Biasanya, anda harus memanggil kaedah ini dalamAppServiceProvider
atau penyedia perkhidmatan lain yang akan dimuatkan pada setiap permintaan program: 🎜rrreee🎜{note}
🎜Membungkus sumber bersarang🎜🎜Anda mempunyai kebebasan sepenuhnya dalam menentukan cara persatuan sumber dibungkus. Jika anda mahu semua koleksi sumber dibalut dengan kekunciwithoutWrappin
Kaedah ini hanya akan melumpuhkan pembungkusan sumber peringkat tertinggi dan tidak akan memadamkan kuncidata
yang anda tambahkan secara manual pada koleksi sumber. 🎜data
tidak kira betapa bersarangnya, maka anda perlu menentukan kelas pengumpulan sumber untuk setiap sumber dan membalut koleksi yang dikembalikan dalamdata kod> kunci. 🎜🎜Sudah tentu, anda mungkin bimbang bahawa sumber peringkat teratas akan dibalut dengan dua kekunci
. Yakinlah, Laravel tidak akan membiarkan sumber anda dibalut dua kali, jadi anda tidak perlu risau tentang koleksi sumber yang ditukar menjadi berbilang sarang: 🎜rrreee 🎜 Pembalut data dan penomboran 🎜🎜 Apabila mengembalikan koleksi bernombor dalam respons sumber , walaupun anda memanggil kaedahdata tanpa Bungkus
, Laravel akan membungkus data sumber anda dalam kekuncidata
. Ini kerana sentiasa terdapat kuncimeta
danlinks
dalam respons penomboran yang mengandungi maklumat status penomboran: 🎜rrreee🎜🎜🎜 Penomboran🎜🎜Anda boleh menghantar contoh penomboran kepada kaedahkoleksi sumber atau koleksi sumber tersuai: 🎜rrreee🎜Selalu adameta dan pautan< dalam penomboran respons Kekunci /code> mengandungi maklumat status penomboran: 🎜rrreee🎜🎜🎜Atribut bersyarat🎜🎜Kadangkala, anda mungkin mahu menambah atribut pada respons sumber apabila keadaan tertentu ditemui di dalam. Sebagai contoh, anda mungkin ingin menambah nilai pada respons sumber jika pengguna semasa ialah "pentadbir". Dalam kes ini, Laravel menyediakan beberapa kaedah pembantu untuk membantu anda menyelesaikan masalah. Kaedah bila
boleh digunakan untuk menambah atribut secara bersyarat pada respons sumber: 🎜rrreee🎜Dalam contoh di atas, hanya jika kaedahisAdmin
mengembalikantrue
, kuncirahsia
akhirnya akan dikembalikan dalam respons sumber. Jika kaedah ini mengembalikanfalse
, kuncirahsia
akan dipadamkan sebelum respons sumber dihantar kepada klien. Kaedahbila
membolehkan anda mengelak daripada menggabungkan tatasusunan dengan pernyataan bersyarat dan sebaliknya menulis sumber anda dengan cara yang lebih elegan. 🎜🎜Kaedahbila
juga menerima penutupan sebagai parameter kedua, dan nilai yang dikembalikan dikira daripada penutupan hanya jika syarat yang diberikan adalahbenar: 🎜rrreee Campur data secara bersyarat
Kadangkala, anda mungkin mahu menambah berbilang atribut pada respons sumber apabila syarat tertentu dipenuhi. Dalam kes ini, anda boleh menggunakan kaedah
rrreeemergeWhen
untuk menambah berbilang atribut pada respons apabila syarat yang diberikan adalahtrue
:mergeWhen
方法在给定的条件为true
时将多个属性添加到响应中:同理,如果给定的条件为
false
时,则这些属性将会在资源响应被发送给客户端之前被移除。{note}
mergeWhen
方法不应该被使用在混合字符串和数字键的数组中。此外,它也不应该被使用在不按顺序排列的数字键的数组中。条件关联
除了有条件地添加属性之外,你还可以根据模型关联是否已加载来有条件地在你的资源响应中包含关联。这允许你在控制器中决定加载哪些模型关联,这样你的资源可以在模型关联被加载后才添加它们。
这样做可以避免在你的资源中出现 「N+1」 查询问题。你应该使用
rrreeewhenLoaded
方法来有条件的加载关联。为了避免加载不必要的关联,此方法接受关联的名称而不是关联本身作为其参数:在上面这个例子中,如果关联没有被加载,则
posts
键将会在资源响应被发送给客户端之前被删除。条件中间表信息
除了在你的资源响应中有条件地包含关联外,你还可以使用
rrreeewhenPivotLoaded
方法有条件地从多对多关联的中间表中添加数据。whenPivotLoaded
方法接受的第一个参数为中间表的名称。第二个参数是一个闭包,它定义了在模型上如果中间表信息可用时要返回的值:如果你的中间表使用的是
rrreeepivot
以外的访问器,你可以使用whenPivotLoadedAs
方法:添加元数据
一些 JSON API 标准需要你在资源和资源集合响应中添加元数据。这通常包括资源或相关资源的
rrreeelinks
,或一些关于资源本身的元数据。如果你需要返回有关资源的其他元数据,只需要将它们包含在toArray
方法中即可。例如在转换资源集合时你可能需要添加links
信息:当添加额外的元数据到你的资源中时,你不必担心会覆盖 Laravel 在返回分页响应时自动添加的
Begitu juga, jika diberikan Apabila syarat yang ditentukan adalahlinks
或meta
键。你添加的任何其他links
会与分页响应添加的links
rrreeefalse
, atribut ini akan dialih keluar sebelum respons sumber dihantar kepada klien. 🎜🎜{note} Kaedah
🎜🎜mergeWhen
tidak boleh digunakan dalam tatasusunan yang mencampurkan rentetan dan kekunci angka. Selain itu, ia tidak boleh digunakan dalam tatasusunan kekunci angka bukan urutan. 🎜Hubungan bersyarat
🎜Selain menambah sifat secara bersyarat, anda juga boleh menambah sifat berdasarkan sama ada hubungan model mempunyai telah dimuatkan dengan bersyarat sertakan perkaitan dalam respons sumber anda. Ini membolehkan anda memutuskan dalam pengawal perkaitan model mana yang dimuatkan, supaya sumber anda hanya boleh menambahkannya selepas perkaitan model dimuatkan. 🎜🎜Melakukan ini boleh mengelakkan masalah pertanyaan "N+1" dalam sumber anda. Anda harus menggunakan kaedahwhenLoaded
untuk memuatkan perkaitan secara bersyarat. Untuk mengelakkan memuatkan perkaitan yang tidak perlu, kaedah ini menerima nama perkaitan sebagai parameternya dan bukannya perkaitan itu sendiri: 🎜rrreee🎜Dalam contoh di atas, jika perkaitan tidak dimuatkan, kekunciposts
akan menjadi dalam Respons sumber dipadamkan sebelum dihantar kepada klien. 🎜🎜Maklumat jadual perantaraan bersyarat🎜🎜Selain memasukkan perkaitan secara bersyarat dalam respons sumber anda, anda juga boleh menggunakan kaedahwhenPivotLoaded
untuk menambah data secara bersyarat daripada jadual perantaraan dalam perkaitan banyak-ke-banyak. Parameter pertama yang diterima oleh kaedahwhenPivotLoaded
ialah nama jadual perantaraan. Parameter kedua ialah penutupan yang mentakrifkan nilai yang akan dikembalikan jika maklumat jadual perantaraan tersedia pada model: 🎜rrreee🎜 Jika jadual perantaraan anda menggunakan pengakses selainpivot
, Anda boleh menggunakan < kod>whenPivotLoadedAs kaedah: 🎜rrreee🎜🎜Tambah metadata
🎜Sesetengah piawaian API JSON memerlukan anda Tambah metadata pada sumber dan respons pengumpulan sumber. Ini biasanya termasukpautan untuk sumber atau sumber yang berkaitan, atau beberapa metadata tentang sumber itu sendiri. Jika anda perlu memulangkan metadata tambahan tentang sumber, cuma masukkannya dalam kaedah toArray
. Contohnya apabila menukar koleksi sumber, anda mungkin perlu menambah maklumatpautan: 🎜rrreee🎜Apabila menambahkan metadata tambahan pada sumber anda, anda tidak perlu risau tentang menimpa apa yang ditambahkan secara automatik oleh Laravel apabila mengembalikan kekunci pautan atau meta
jawapan bernombor. Mana-manapautan lain yang anda tambahkan akan digabungkan dengan pautan yang ditambahkan oleh respons bernombor. 🎜 Metadata peringkat atas
Kadangkala anda mungkin ingin menambahkan beberapa metadata pada respons sumber apabila sumber itu dikembalikan sebagai sumber peringkat teratas. Ini biasanya termasuk maklumat meta tentang keseluruhan respons. Anda boleh menambah kaedah
rrreeewith
pada kelas sumber untuk menentukan metadata. Kaedah ini harus mengembalikan tatasusunan metadata, yang akan disertakan dalam tindak balas sumber apabila sumber itu dipaparkan sebagai sumber peringkat teratas:with
方法来定义元数据。此方法应返回一个元数据数组,当资源被作为顶层资源渲染时,这个数组将会被包含在资源响应中:构造资源时添加元数据
你还可以在路由或者控制器中构造资源实例时添加顶层数据。所有资源都可以使用
rrreeeadditional
方法来接受应该被添加到资源响应中的数据数组:响应资源
就像你知道的那样, 资源可以直接在路由和控制器中被返回:
rrreee但有些时候,在发送给客户端前你可能需要自定义 HTTP 响应。 你有两种办法。第一,你可以在链式上调用
rrreeeresponse
方法。此方法将会返回IlluminateHttpResponse
实例,允许你自定义响应头信息:另外,你还可以在资源中定义一个
Tambah metadata semasa membina sumberwithResponse
rrreee