Laravel API 资源提供优雅的方法来有条件地包含响应中的属性,允许您创建灵活高效的 API,以适应不同的上下文和权限。
在构建 API 时,您经常需要根据不同的场景自定义响应——例如,仅向管理员显示某些字段,仅在请求时包含相关数据,或根据端点调整响应格式。Laravel 的 API 资源通过条件属性提供强大的方法来处理这些情况。
一些可用的关键方法是:
when()
:仅当条件为真时才包含属性whenLoaded()
:仅当关系已加载时才包含关系whenNotNull()
:仅当属性不为 null 时才包含属性whenHas()
:仅当模型上存在属性时才包含属性以下是一个使用条件属性的示例:
use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->when($request->user()->isAdmin(), $this->email), ]; } }
让我们探索一个具有条件数据的产品目录 API 的实际示例:
<?php namespace App\Http\Resources; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; class ProductResource extends JsonResource { public function toArray(Request $request): array { return [ 'id' => $this->id, 'name' => $this->name, 'slug' => $this->slug, 'price' => $this->price, // 仅在详细视图中包含完整描述 'description' => $this->when( $request->route()->named('products.show'), $this->description, $this->excerpt ), // 为已认证的用户包含库存信息 'stock_level' => $this->when( $request->user()?->can('view-inventory'), $this->stock_count ), // 加载时包含关系 'category' => new CategoryResource($this->whenLoaded('category')), // 有条件地包含计数 'reviews_count' => $this->when( $request->include_counts, $this->reviews_count ), // 包含管理员数据 'profit_margin' => $this->when( $request->user()?->isAdmin(), fn() => $this->calculateProfitMargin() ), ]; } }
Laravel API 资源中的条件属性使您能够构建上下文感知的响应,同时保持代码简洁易维护。
以上是Laravel资源中的动态API响应控制的详细内容。更多信息请关注PHP中文网其他相关文章!