WEBOPIXEL

LaravelでAPI開発するときの便利機能まとめ

Posted: 2019.06.14 / Category: PHP / Tag: 

LaravelはSPAのAPI開発用に便利な機能がありますのでいくつかご紹介します。

Sponsored Link

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

'providers' => [
	...
	Clockwork\Support\Laravel\ClockworkServiceProvider::class
]

'aliases' => [
	...
	'Clockwork' => Clockwork\Support\Laravel\Facade::class
]

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

Clockworkでlaravelのクエリの確認

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

clock(User::all());

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

Clockworkでlaravelの変数の確認
Clockwork

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

Laravel Telescope

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

CRUDのルーティングを設定したいときはRoute::resource('users', 'UsersController')のように指定すると、まとめて設定できるのですが、createeditは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'
	];
}