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.phpprovidersaliasesを追加します。

config/app.php

  1. 'providers' => [
  2. ...
  3. Clockwork\Support\Laravel\ClockworkServiceProvider::class
  4. ]
  5.  
  6. 'aliases' => [
  7. ...
  8. 'Clockwork' => Clockwork\Support\Laravel\Facade::class
  9. ]

Chromeのデベロッパーツールを開くとClockworkというタブが追加されています。
さらにその中のDatabaseタブを開くとクエリーの確認をすることができます。

Clockworkでlaravelのクエリの確認

ライブラリをインストールするとclockというヘルパーが使用できるようになります。
これはddのような感じに変数を確認することができます。

  1. clock(User::all());

Logタブに変数が展開されます。

Clockworkでlaravelの変数の確認
Clockwork

最近だと Telescope もよさそうですがどうなんでしょう。

Laravel Telescope

ルーティングはapiResourceで一括設定

CRUDのルーティングを設定したいときはRoute::resource('users', 'UsersController')のように指定すると、まとめて設定できるのですが、createeditはView用のルーテイングなのでSPAでは不要ですね。
純粋なAPIで使用するCRUDの場合はapiResourceを使用します。

  1. Route::apiResource('users', 'UsersController');

これで、index,store,show,update,destroyが使用できるようになります。
複数のコントローラーをまとめて指定する場合はapiResourcesを使用します。

  1. Route::apiResources([
  2. 'tasks' => 'Api\TaskController',
  3. 'users' => 'Api\UserController'
  4. ]);

jsonの形成はApiResourceを使おう

単純なデータを表示したい場合は基本モデルをreturnするだけでjsonを返してくれます。

  1. public function show(User $user)
  2. {
  3. return $user;
  4. }

ただ、リレーションも表示した場合、Viewファイルだったら深く考えないでも表示できましたが、SPAの場合はコントローラーで加工しないといけないのかと思ったのですが、ApiResourceというので加工できます。

Artisanでリソースファイルを作成します。

$ php artisan make:resource UserResource

例えば、id、nameだけ欲しい場合は下記のようになります。

app/Http/Resources/UserResource.php

  1. <?php
  2. namespace App\Http\Resources;
  3.  
  4. use Illuminate\Http\Resources\Json\JsonResource;
  5.  
  6. class UserResource extends JsonResource
  7. {
  8. public function toArray($request)
  9. {
  10. return [
  11. 'id' => $this->id,
  12. 'name' => $this->name
  13. ];
  14. }
  15. }

コントローラーで一つだけ返す場合はmakeを使います。

  1. return UserResource::make($user);

複数(配列で)返す場合collectionを使います。

  1. return UserResource::collection($users);

これはリソースファイルでも使えるので、リレーションを返したい場合は下記のような記述になります。

  1. public function toArray($request)
  2. {
  3. return [
  4. 'id' => $this->id,
  5. 'title' => $this->title,
  6. 'user' => UserResource::make($this->user)
  7. ];
  8. }

プロパティのキャスト

例えばidでINTカラムの場合でも、フロントからStringとして送信するとStringで返してしまいます。
モデルでキャストを設定しておくと、指定した型で必ず返すので安心です。

  1. class Task extends Model
  2. {
  3. protected $casts = [
  4. 'project_id' => 'integer'
  5. 'due_at' => 'datetime'
  6. ];
  7. }