在 Laravel 開發 API 時,直接在 Controller 內進行資料加工可能會讓程式碼變得雜亂且難以維護。因此,Laravel 提供 Resource (資源轉換器) 來解決這個問題,讓我們可以統一管理 API 的輸出格式,將模型model
或模型集合collection
轉換為適合 API 輸出的格式,並在需要時對資料進行處理。
Laravel 提供了 Resource
來解決這個問題,它的作用類似於 Web 開發中的 Presenter。
Laravel 提供 php artisan make:resource
指令來建立 Resource:
php artisan make:resource UserResource
這會在 app/Http/Resources
目錄下建立 UserResource.php
。
開啟 UserResource.php
,修改 toArray
方法來決定 API 的輸出格式:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toDateTimeString(),
'profile' => new ProfileResource($this->whenLoaded('profile')), // 若有載入關聯,則回傳 Profile
];
}
}
這樣,我們就能夠在 UserResource
內部處理資料的格式轉換,而不需要在 Controller 內部寫這些邏輯。
在 UserController.php
中,我們可以直接使用 UserResource
來格式化輸出:
<?php
use App\Http\Resources\UserResource;
use App\Models\User;
class UserController extends Controller
{
public function show($id)
{
$user = User::with('profile')->findOrFail($id);
return new UserResource($user);
}
}
若是返回多筆資料,可以使用 Resource Collection
:
<?php
use App\Http\Resources\UserResource;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
$users = User::with('profile')->paginate(10);
return UserResource::collection($users);
}
}
總結
這樣的設計不僅讓 API 更加清晰,也提升了可讀性與擴展性!