Fractalは、LaravelおよびLumenでAPIレスポンスを整理し、データを適切にフォーマットして返すための強力なツールです。APIレスポンスを一貫性のある形式にすることで、クライアント側でのデータ処理を簡潔にし、開発者がより効率的に作業できるようにします。この記事では、Fractalを使用してLaravelおよびLumenでAPIレスポンスを構築する方法を完全かつ包括的に説明します。
1. Fractalとは?
Fractalは、APIのレスポンスデータを整形するためのPHPライブラリです。このライブラリを使うことで、JSONレスポンスを簡単に作成し、複雑なデータ構造を分かりやすく、統一感のある形式でクライアントに返すことができます。特に、リレーションシップのあるデータ(例えば、ユーザーとその投稿など)をネストして返す際に便利です。

2. Fractalのインストール
まず、Fractalライブラリをインストールする必要があります。LaravelとLumenの両方で利用可能ですが、まずはComposerを使ってインストールします。
bashcomposer require league/fractal
これでFractalライブラリがインストールされ、プロジェクト内で使用できるようになります。
3. LaravelおよびLumenでFractalを使用する
LaravelやLumenでFractalを使用するには、基本的に次のステップに従います。
3.1 Laravelでの設定
Laravelの場合、Fractalを統合するためにspatie/laravel-fractal
というパッケージを利用するのが一般的です。以下のコマンドでインストールします。
bashcomposer require spatie/laravel-fractal
インストール後、config/app.php
ファイルにサービスプロバイダを追加します。
php'providers' => [
// その他のプロバイダ
Spatie\Fractal\FractalServiceProvider::class,
],
3.2 Lumenでの設定
Lumenでは、Fractalを直接利用するため、上記のspatie/laravel-fractal
パッケージをそのまま使用することもできますが、設定ファイルが少ないため、サービスプロバイダを手動で追加する必要があります。bootstrap/app.php
に次の行を追加します。
php$app->register(Spatie\Fractal\FractalServiceProvider::class);
4. Transformerの作成
Fractalでは、データを変換するためのTransformer
を作成します。このTransformer
は、どのようにデータをフォーマットするかを定義するクラスです。
例えば、ユーザーのデータを変換するUserTransformer
を作成します。
php
namespace App\Transformers;
use League\Fractal\TransformerAbstract;
use App\Models\User;
class UserTransformer extends TransformerAbstract
{
public function transform(User $user)
{
return [
'id' => (int) $user->id,
'name' => (string) $user->name,
'email' => (string) $user->email,
];
}
}
このクラスは、User
モデルのインスタンスを変換し、APIレスポンスとして返すデータを定義します。
5. コントローラーでの利用
コントローラー内でFractalを使用してデータを変換し、APIレスポンスを返します。Laravelでは、Fractalを使うために、Fractal
ファサードを利用します。
php
namespace App\Http\Controllers;
use App\Models\User;
use App\Transformers\UserTransformer;
use Illuminate\Http\Request;
use League\Fractal\Facades\Fractal;
class UserController extends Controller
{
public function index()
{
$users = User::all();
$data = Fractal::collection($users)
->transformWith(new UserTransformer())
->toArray();
return response()->json($data);
}
}
この例では、すべてのユーザーを取得し、それをUserTransformer
で変換した後、JSONレスポンスとして返しています。
6. リレーションの変換
Fractalでは、リレーションシップ(例えば、ユーザーとその投稿)を変換することもできます。これを行うためには、include
という概念を使用します。
例えば、ユーザーが所有する投稿を含めたい場合、以下のようにします。
php
namespace App\Transformers;
use League\Fractal\TransformerAbstract;
use App\Models\User;
use App\Models\Post;
class UserTransformer extends TransformerAbstract
{
protected $availableIncludes = ['posts'];
public function transform(User $user)
{
return [
'id' => (int) $user->id,
'name' => (string) $user->name,
'email' => (string) $user->email,
];
}
public function includePosts(User $user)
{
$posts = $user->posts; // ユーザーの投稿を取得
return $this->collection($posts, new PostTransformer());
}
}
この場合、$availableIncludes
にposts
を指定し、includePosts
メソッドで投稿を変換しています。このメソッドでは、PostTransformer
を使って各投稿を変換しています。
7. クエリパラメーターでインクルードを制御
APIレスポンスにリレーションを含める場合、通常はクエリパラメータを使って制御します。例えば、/users?include=posts
のようにリクエストすることで、posts
リレーションをレスポンスに含めることができます。
これを実現するために、FractalのparseIncludes
メソッドを使います。
phppublic function index(Request $request)
{
$users = User::all();
$includes = $request->input('include');
$data = Fractal::collection($users)
->transformWith(new UserTransformer())
->parseIncludes($includes)
->toArray();
return response()->json($data);
}
8. 結論
Fractalを使うことで、LaravelおよびLumenでのAPIレスポンスを非常に柔軟かつ整理された方法で管理できます。リレーションシップの変換や、インクルード機能を駆使することで、データの整形を効率よく行い、クライアントとのやり取りを簡潔にすることができます。API設計のベストプラクティスに則ったレスポンス形式を維持できるため、開発者にとって大きな助けとなります。