在 Laravel API 中自定义资源响应
Laravel 的 withResponse
方法使开发人员能够在 HTTP 响应对象到达客户端之前修改 HTTP 响应对象来微调 API 响应。此功能不仅限于简单的数据转换,还允许你自定义标头*header)、状态代码和其他响应属性。
当构建需要向客户端传递元数据、版本信息或专用标头的专业 API 时,这种方法尤其有价值。
class UserResource extends JsonResource
{
public function withResponse($request, $response)
{
$response->header('X-Resource-Type', 'User');
}
}
下面是实现复合型 API 响应的示例:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Request;
class DocumentResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'content' => $this->when(
$request->user()->canViewContent($this->resource),
$this->content
),
'created_at' => $this->created_at,
'updated_at' => $this->updated_at
];
}
public function withResponse(Request $request, $response)
{
// Set resource-specific headers
$response->header('X-Document-ID', $this->id);
// Add caching information for public documents
if ($this->is_public) {
$response->header('Cache-Control', 'public, max-age=3600');
$response->header('ETag', md5($this->updated_at));
}
// Set appropriate status codes
if ($this->wasRecentlyCreated) {
$response->setStatusCode(201);
}
// Add deprecation warning for legacy fields if requested
if ($request->has('include_legacy')) {
$response->header('X-Deprecated-Fields', 'legacy_format,old_structure');
$response->header('X-Deprecation-Date', '2024-07-01');
}
}
}
withResponse
方法将 API 资源从简单的数据容器转换为完全可定制的 HTTP 响应,这些响应与主要内容一起传递重要的元数据。