Laravel 5.8を使用しています。
ブラウザ拡張機能のClockworkでデバッグ
Laravelのデバッグは「Laravel Debugbar」が広く使われていますが、これはViewにデバッグ情報を描画するので、ViewのないAPI開発には微妙だったりします。
そこでおすすすめなのが、Chrome/Firefoxの拡張機能の「Clockwork」です。
ブラウザの拡張機能は、それぞれ下記からダウンロードします。
拡張機能の他にコンポーザーでライブラリをインストールする必要があります。
$ composer require itsgoingd/clockworkLaravelのバージョンが5.6以上ならこれだけで使用できますが、5.5以下ならconfig/app.phpにprovidersとaliasesを追加します。
'providers' => [ ... Clockwork\Support\Laravel\ClockworkServiceProvider::class]
'aliases' => [ ... 'Clockwork' => Clockwork\Support\Laravel\Facade::class]Chromeのデベロッパーツールを開くとClockworkというタブが追加されています。
さらにその中のDatabaseタブを開くとクエリーの確認をすることができます。

ライブラリをインストールするとclockというヘルパーが使用できるようになります。
これはddのような感じに変数を確認することができます。
clock(User::all());Logタブに変数が展開されます。

最近だと 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だけ欲しい場合は下記のようになります。
<?phpnamespace 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' ];}
