どうも、シローです。
今回はLaravelでモデルデータをAPIとして返す場合は、Resourcesを使うと便利という内容です。
Laravel Resourcesとは
APIでモデルデータをJSONデータとして返す場合、キー名をキャメル<=>スネークの変換や出力したくないデータを除外、データのフォーマットを中間で挟むケースがあります。
これらの処理を簡単に提供できる機能がLaravel Resourcesになります。
Resourceの作成
Resoucesはaritisanコマンドで以下のように作成できます。
実行したらapp/Http/Resources
フォルダにファイルが追加されます。
1 |
php artisan make:resource UserResource |
Resourceの設定
app/Http/Resouces/UserResource.phpはtoArrayというメソッドを持ち、この関数の返却値がJSONレスポンスとなります。
モデルのテーブル名はスネーク型なため、ここでキー名をキャメルケースに変換したり、パスワードなどの機密データは出力しないように制御できます。
モデルデータへは$this
のプロパティでアクセスできます。
app/Http/Resources/UserResource.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable */ public function toArray($request) { return [ 'id' => $this->id, 'email' => $this->email, 'name' => $this->name, 'profileImagePath' => $this->profile_image_path ]; } } |
Resourceを使ってJSONレスポンスを返す
コントローラでDBからユーザ情報を取得し、Resouceを介してJSONレスポンスとして出力する例はこんな感じになります。
app/Http/Controllers/UserController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Services\UserService; use App\Http\Resources\UserResource; use Illuminate\Support\Facades\Auth; class UserController extends Controller { public function __construct(UserService $userService) { $this->userService = $userService; } /** * get me */ public function getMe(Request $request) { if (Auth::check()) { $user = Auth::user(); return new UserResource($user); // Userモデルのインスタンスを引数に渡す } return response()->json([], Response::HTTP_UNAUTHORIZED); } } |