Laravel 5.8を使用しています。
ブラウザ拡張機能のClockworkでデバッグ
Laravelのデバッグは「Laravel Debugbar」が広く使われていますが、これはViewにデバッグ情報を描画するので、ViewのないAPI開発には微妙だったりします。
そこでおすすすめなのが、Chrome/Firefoxの拡張機能の「Clockwork」です。
ブラウザの拡張機能は、それぞれ下記からダウンロードします。
Google Chrome / Firefox
拡張機能の他にコンポーザーでライブラリをインストールする必要があります。
$ composer require itsgoingd/clockwork
Laravelのバージョンが5.6以上ならこれだけで使用できますが、5.5以下ならconfig/app.php
にproviders
とaliases
を追加します。
config/app.php
'providers' => [ ... Clockwork\Support\Laravel\ClockworkServiceProvider::class ] 'aliases' => [ ... 'Clockwork' => Clockwork\Support\Laravel\Facade::class ]
Chromeのデベロッパーツールを開くとClockwork
というタブが追加されています。
さらにその中のDatabase
タブを開くとクエリーの確認をすることができます。
ライブラリをインストールするとclock
というヘルパーが使用できるようになります。
これはdd
のような感じに変数を確認することができます。
clock(User::all());
Log
タブに変数が展開されます。
Clockwork
最近だと Telescope もよさそうですがどうなんでしょう。
Laravel Telescope
ルーティングはapiResourceで一括設定
CRUDのルーティングを設定したいときはRoute::resource('users', 'UsersController')
のように指定すると、まとめて設定できるのですが、create
とedit
はView用のルーテイングなのでSPAでは不要ですね。
純粋なAPIで使用するCRUDの場合はapiResource
を使用します。
Route::apiResource('users', 'UsersController');
これで、index,store,show,update,destroy
が使用できるようになります。
複数のコントローラーをまとめて指定する場合はapiResources
を使用します。
Route::apiResources([ 'tasks' => 'Api\TaskController', 'users' => 'Api\UserController' ]);
jsonの形成はApiResourceを使おう
単純なデータを表示したい場合は基本モデルをreturnするだけでjsonを返してくれます。
public function show(User $user) { return $user; }
ただ、リレーションも表示した場合、Viewファイルだったら深く考えないでも表示できましたが、SPAの場合はコントローラーで加工しないといけないのかと思ったのですが、ApiResourceというので加工できます。
Artisanでリソースファイルを作成します。
$ php artisan make:resource UserResource
例えば、id、nameだけ欲しい場合は下記のようになります。
app/Http/Resources/UserResource.php
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name ]; } }
コントローラーで一つだけ返す場合はmake
を使います。
return UserResource::make($user);
複数(配列で)返す場合collection
を使います。
return UserResource::collection($users);
これはリソースファイルでも使えるので、リレーションを返したい場合は下記のような記述になります。
public function toArray($request) { return [ 'id' => $this->id, 'title' => $this->title, 'user' => UserResource::make($this->user) ]; }
プロパティのキャスト
例えばidでINTカラムの場合でも、フロントからStringとして送信するとStringで返してしまいます。
モデルでキャストを設定しておくと、指定した型で必ず返すので安心です。
class Task extends Model { protected $casts = [ 'project_id' => 'integer' 'due_at' => 'datetime' ]; }