Ressources API
Introduction
- Collection de ressources
- Aperçu du concept
- Collection de ressources
- Classe de ressources de base personnalisée Wra ping des ressources imbriquées
- Encapsulation et pagination des données
- Paging
- Attributs conditionnels
- Données fusionnées sous condition
- Informations conditionnelles sur la table intermédiaire
- Métadonnées de niveau supérieur
- Ajouter des métadonnées lors de la construction de ressources
- Ressources réactives
Éloquent : ressources API
Introduction
Lors de la construction une API, vous avez souvent besoin d'une couche de transformation pour vous connecter The Eloquent modèle et la réponse JSON réelle renvoyée à l'utilisateur. Les classes de ressources de Laravel vous permettent de convertir des modèles et des collections de modèles en JSON de manière plus intuitive et plus simple.
Générer des ressources
Vous pouvez utiliser la commande
make:resource
Artisan pour générer une classe de ressources. Par défaut, les ressources générées seront placées dans le dossierapp/Http/Resources
de l'application. Les ressources héritent de la classeIlluminateHttpResourcesJsonJsonResource
: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 de ressources
En plus de générer des ressources pour convertir un seul modèle, vous pouvez également générer une collection de ressources pour convertir une collection de modèles. . Cela vous permet d'inclure des liens et d'autres méta-informations liées à une ressource donnée dans la réponse. 🎜🎜Vous devez ajouter l'indicateur--collection
lors de la génération de ressources pour générer une collection de ressources. Alternativement, vous pouvez inclure directementCollection
dans le nom de la ressource pour indiquer à Laravel qu'une collection de ressources doit être générée. Les collections de ressources héritent de la classeIlluminateHttpResourcesJsonResourceCollection
: 🎜php artisan make:resource UserCollection
🎜🎜🎜🎜Présentation du concept🎜🎜{tip} Il s'agit d'un aperçu de haut niveau des ressources et collections de ressources . Il est fortement recommandé de lire les autres sections de ce document pour mieux comprendre comment mieux personnaliser et utiliser la ressource. 🎜
🎜Avant de découvrir comment personnaliser l'écriture de vos ressources, voyons d'abord comment utiliser les ressources dans Laravel. Une classe de ressources représente un modèle unique qui doit être converti au format JSON. Par exemple, nous avons maintenant une simple classe de ressourcesUser
: 🎜<?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', ], ]; } }
🎜Chaque classe de ressources définit une méthodetoArray
qui renvoie ce qui doit être converti lors de l'envoi de la réponse dans un attribut JSON. tableau. Notez ici que nous pouvons utiliser directement la variable$this
pour accéder aux propriétés du modèle. En effet, la classe de ressources transmettra automatiquement les propriétés et les méthodes au modèle sous-jacent pour un accès facile. Vous pouvez renvoyer des ressources définies dans des routes ou des contrôleurs : 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::all()); });
Resource Collection
🎜Vous pouvez utiliser la méthodecollection
dans des routes ou des contrôleurs pour créer des instances de ressources. ou une réponse paginée : 🎜<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class User extends JsonResource{ /** * 指示是否应保留资源的集合键。 * * @var bool */ public $preserveKeys = true; }
Bien sûr, en utilisant la méthode ci-dessus, vous ne pourrez pas ajouter de métadonnées supplémentaires et les renvoyer avec la collection. Si vous avez besoin d'une réponse de collection de ressources personnalisée, vous devez créer une ressource dédiée pour représenter la collection :
use App\User; use App\Http\Resources\User as UserResource; Route::get('/user', function () { return UserResource::collection(User::all()->keyBy->id); });
Vous pouvez facilement définir les métadonnées que vous souhaitez renvoyer dans la réponse dans la classe de collection de ressources générée :
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; class UserCollection extends ResourceCollection{ /** * collects 属性定义了资源类。 * * @var string */ public $collects = 'App\Http\Resources\Member'; }
Vous pouvez retourner une collection définie de ressources dans une route ou un contrôleur :
<?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, ]; } }
Protéger les clés de collection
Lors du retour d'une collection de ressources à partir d'une route, Laravel réinitialisera les clés de la collection afin qu'elles soient dans un ordre numérique simple. Cependant, l'attribut
preserveKeys
peut être ajouté à la classe de ressources pour indiquer si les clés de collection doivent être préservées :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() { // } }
Lorsque l'attributpreserveKeys
est défini surtrue
, les clés de la collection seront protégées :<?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]; } }
Classe de ressources de base personnaliséeHabituellement, l'attribut$this->collection
de la collection de ressources sera automatiquement renseigné, et le résultat sera que chaque élément de la collection sera mappé à sa classe de ressources individuelle. Une seule classe de ressources est supposée être le nom de classe d'une collection, mais n'a pas de chaîneCollection
à la fin.{ "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} Si vous n'avez pas lu l'Aperçu du concept🎜, alors je vous recommande fortement de le lire avant de continuer à lire ce document. 🎜🎜Essentiellement, le rôle des ressources est simple. Il leur suffit de convertir un modèle donné en tableau. Ainsi, chaque ressource contient une méthodetoArray
qui convertit les propriétés de votre modèle en un tableau convivial qui peut être renvoyé à l'utilisateur : 🎜use App\User; use App\Http\Resources\UserCollection; Route::get('/users', function () { return new UserCollection(User::paginate()); });
🎜Vous pouvez renvoyer celles définies dans les routes ou les contrôleurs. Ressources : 🎜{ "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 } }
🎜 Associations🎜🎜Si vous souhaitez inclure les ressources associées dans la réponse, il vous suffit de les ajouter au tableau renvoyé par la méthodetoArray
. Dans l'exemple suivant, nous utiliserons la méthodecollection
de la ressourcePost
pour ajouter les publications de l'utilisateur à la réponse de la ressource : 🎜/** * 将资源转换成数组 * * @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} Si vous uniquement Pour ajouter des ressources associées uniquement lorsque l'association est chargée, consultez la documentation sur les associations conditionnelles. 🎜
🎜Collection de ressources🎜🎜Les ressources convertissent un seul modèle en un tableau, tandis que les collections de ressources convertissent une collection de plusieurs modèles en un tableau. Toutes les ressources fournissent une méthodecollection
pour générer une collection de ressources "temporaire", vous n'avez donc pas besoin d'écrire une classe de collection de ressources pour chaque type de modèle : 🎜'secret' => $this->when(Auth::user()->isAdmin(), function () { return 'secret-value'; }),
🎜Cependant, si vous devez définir le métadonnées de la collection renvoyée, vous devez encore définir une collection de ressources : 🎜/** * 将资源转换成数组 * * @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, ]; }
🎜 Comme une seule ressource, vous pouvez retourner directement une collection de ressources dans une route ou un contrôleur : 🎜/** * 将资源转换成数组 * * @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, ]; }
🎜🎜🎜🎜Data Wrapping
Par défaut, lorsque la réponse de la ressource est convertie en JSON, la ressource de niveau supérieur sera encapsulée dans la clé
data
. Ainsi, une réponse typique de collecte de ressources ressemble à ceci :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'); } }
Vous pouvez désactiver l'encapsulation des ressources de niveau supérieur à l'aide de la méthodewithoutWrapping
de la classe de base de ressources. Habituellement, vous devez appeler cette méthode dansAppServiceProvider
ou d'autres fournisseurs de services qui seront chargés à chaque requête du programme : 🎜rrreee🎜{note}
🎜Encapsulation des ressources imbriquées🎜🎜Vous avez toute liberté pour décider de la manière dont les associations de ressources sont encapsulées. Si vous souhaitez que toutes les collections de ressources soient encapsulées dans des cléswithoutWrappin
Cette méthode désactivera uniquement l'encapsulation de la ressource de niveau supérieur et ne supprimera pas la clédata
que vous avez ajoutée manuellement à la collection de ressources. 🎜data
, quel que soit leur imbrication, vous devez alors définir une classe de collection de ressources pour chaque ressource et envelopper la collection renvoyée dans des données. code> clé. 🎜🎜Bien sûr, vous pouvez craindre que la ressource de niveau supérieur soit enveloppée dans deux clés
data
. Rassurez-vous, Laravel ne laissera jamais vos ressources être doublement enveloppées, vous n'avez donc pas à vous soucier du fait que la collection convertie de ressources soit multi-imbriquée : 🎜rrreee 🎜 Enveloppement et pagination des données 🎜🎜 Lors du renvoi d'une collection paginée dans la réponse de la ressource , même si vous appelez la méthodewithoutWrapping
, Laravel encapsulera vos données de ressources dans la clédata
. En effet, il y a toujours des clésmeta
etlinks
dans les réponses de pagination qui contiennent des informations sur l'état de la pagination : 🎜rrreee🎜🎜🎜 Pagination🎜🎜Vous pouvez transmettre une instance de pagination à la méthodecollection
de la ressource ou à une collection de ressources personnalisée : 🎜rrreee🎜Il y a toujours desméta
et desliens< dans la pagination réponse La clé /code> contient des informations sur l'état de la pagination : 🎜rrreee🎜🎜🎜Attributs conditionnels🎜🎜Parfois, vous souhaiterez peut-être ajouter des attributs à la réponse de la ressource lorsqu'une condition donnée est rencontré à l'intérieur. Par exemple, vous souhaiterez peut-être ajouter une valeur à la réponse de la ressource si l'utilisateur actuel est un « administrateur ». Dans ce cas, Laravel fournit des méthodes d'assistance pour vous aider à résoudre le problème. La méthode
: 🎜rrreee🎜🎜when
peut être utilisée pour ajouter conditionnellement des attributs à la réponse de la ressource : 🎜rrreee🎜Dans l'exemple ci-dessus, uniquement si la méthodeisAdmin
renvoietrue
, la clésecret
sera finalement renvoyée dans la réponse de la ressource. Si cette méthode renvoiefalse
, la clésecret
sera supprimée avant que la réponse de la ressource ne soit envoyée au client. La méthodewhen
vous permet d'éviter de concaténer des tableaux avec des instructions conditionnelles et d'écrire vos ressources de manière plus élégante. 🎜🎜La méthodewhen
accepte également une fermeture comme deuxième paramètre, et la valeur renvoyée est calculée à partir de la fermeture uniquement si la condition donnée esttrue
: 🎜rrreeeFusionner les données sous condition
Parfois, vous souhaiterez peut-être ajouter plusieurs attributs à la réponse de la ressource lorsqu'une condition donnée est remplie. Dans ce cas, vous pouvez utiliser la méthode
rrreeemergeWhen
pour ajouter plusieurs attributs à la réponse lorsque la condition donnée esttrue
:mergeWhen
方法在给定的条件为true
时将多个属性添加到响应中:同理,如果给定的条件为
false
时,则这些属性将会在资源响应被发送给客户端之前被移除。{note}
mergeWhen
方法不应该被使用在混合字符串和数字键的数组中。此外,它也不应该被使用在不按顺序排列的数字键的数组中。条件关联
除了有条件地添加属性之外,你还可以根据模型关联是否已加载来有条件地在你的资源响应中包含关联。这允许你在控制器中决定加载哪些模型关联,这样你的资源可以在模型关联被加载后才添加它们。
这样做可以避免在你的资源中出现 「N+1」 查询问题。你应该使用
rrreeewhenLoaded
方法来有条件的加载关联。为了避免加载不必要的关联,此方法接受关联的名称而不是关联本身作为其参数:在上面这个例子中,如果关联没有被加载,则
posts
键将会在资源响应被发送给客户端之前被删除。条件中间表信息
除了在你的资源响应中有条件地包含关联外,你还可以使用
rrreeewhenPivotLoaded
方法有条件地从多对多关联的中间表中添加数据。whenPivotLoaded
方法接受的第一个参数为中间表的名称。第二个参数是一个闭包,它定义了在模型上如果中间表信息可用时要返回的值:如果你的中间表使用的是
rrreeepivot
以外的访问器,你可以使用whenPivotLoadedAs
方法:添加元数据
一些 JSON API 标准需要你在资源和资源集合响应中添加元数据。这通常包括资源或相关资源的
rrreeelinks
,或一些关于资源本身的元数据。如果你需要返回有关资源的其他元数据,只需要将它们包含在toArray
方法中即可。例如在转换资源集合时你可能需要添加links
信息:当添加额外的元数据到你的资源中时,你不必担心会覆盖 Laravel 在返回分页响应时自动添加的
De même, si elle est donnée lorsque la condition spécifiée estlinks
或meta
键。你添加的任何其他links
会与分页响应添加的links
rrreeefalse
, ces attributs seront supprimés avant que la réponse de la ressource ne soit envoyée au client. 🎜🎜{note} La méthode
🎜🎜mergeWhen
ne doit pas être utilisée dans des tableaux qui mélangent des chaînes et des touches numériques. De plus, il ne doit pas être utilisé dans un tableau de touches numériques non séquentielles. 🎜Relations conditionnelles
🎜En plus d'ajouter des propriétés de manière conditionnelle, vous pouvez également ajouter des propriétés selon que la relation du modèle a ou non été chargé. Incluez conditionnellement les associations dans vos réponses de ressources. Cela vous permet de décider dans le contrôleur quelles associations de modèles sont chargées, afin que vos ressources ne puissent les ajouter qu'une fois les associations de modèles chargées. 🎜🎜Faire cela peut éviter des problèmes de requêtes "N+1" dans vos ressources. Vous devez utiliser la méthodewhenLoaded
pour charger les associations de manière conditionnelle. Pour éviter de charger des associations inutiles, cette méthode accepte le nom de l'association comme paramètre au lieu de l'association elle-même : 🎜rrreee🎜Dans l'exemple ci-dessus, si l'association n'est pas chargée, la cléposts
sera in La réponse de la ressource est supprimée avant d'être envoyée au client. 🎜🎜Informations conditionnelles sur la table intermédiaire🎜🎜En plus d'inclure conditionnellement l'association dans votre réponse de ressource, vous pouvez également utiliser la méthodewhenPivotLoaded
pour ajouter conditionnellement des données de la table intermédiaire d'une association plusieurs-à-plusieurs. . Le premier paramètre accepté par la méthodewhenPivotLoaded
est le nom de la table intermédiaire. Le deuxième paramètre est une fermeture qui définit la valeur à retourner si les informations de la table intermédiaire sont disponibles sur le modèle : 🎜rrreee🎜 Si votre table intermédiaire utilise un accesseur autre quepivot
, vous pouvez utiliser le < méthode code>whenPivotLoadedAsAjouter des métadonnées
🎜Certaines normes de l'API JSON exigent que vous ajoutiez des métadonnées à la ressource et réponses à la collecte de ressources. Cela inclut généralement desliens
vers la ressource ou les ressources associées, ou des métadonnées sur la ressource elle-même. Si vous devez renvoyer des métadonnées supplémentaires sur la ressource, incluez-les simplement dans la méthodetoArray
. Par exemple, lors de la conversion d'une collection de ressources, vous devrez peut-être ajouter des informationsliens
: 🎜rrreee🎜Lorsque vous ajoutez des métadonnées supplémentaires à vos ressources, vous n'avez pas à vous soucier d'écraser ce que Laravel ajoute automatiquement lors du renvoi d'un réponse paginéeliens
ou cléméta
. Tous les autresliens
que vous ajoutez seront fusionnés avec lesliens
ajoutés par la réponse paginée. 🎜Métadonnées de niveau supérieur
Parfois, vous souhaiterez peut-être ajouter des métadonnées à la réponse de la ressource lorsque la ressource est renvoyée en tant que ressource de niveau supérieur. Cela inclut généralement des méta-informations sur l’ensemble de la réponse. Vous pouvez ajouter la méthode
rrreeewith
à la classe de ressources pour définir les métadonnées. Cette méthode doit renvoyer un tableau de métadonnées, qui seront incluses dans la réponse de la ressource lorsque la ressource est rendue en tant que ressource de niveau supérieur :with
方法来定义元数据。此方法应返回一个元数据数组,当资源被作为顶层资源渲染时,这个数组将会被包含在资源响应中:构造资源时添加元数据
你还可以在路由或者控制器中构造资源实例时添加顶层数据。所有资源都可以使用
rrreeeadditional
方法来接受应该被添加到资源响应中的数据数组:响应资源
就像你知道的那样, 资源可以直接在路由和控制器中被返回:
rrreee但有些时候,在发送给客户端前你可能需要自定义 HTTP 响应。 你有两种办法。第一,你可以在链式上调用
rrreeeresponse
方法。此方法将会返回IlluminateHttpResponse
实例,允许你自定义响应头信息:另外,你还可以在资源中定义一个
Ajoutez des métadonnées lors de la construction de la ressourcewithResponse
rrreee