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'
];
}


