编程

在 Laravel API 中自定义资源响应

139 2025-03-20 04:32:00

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 响应,这些响应与主要内容一起传递重要的元数据。