⭐️ Laravel Resource Reducerを使ってレスポンスを最適化しよう
みなさん、こんにちは。
Laravel APIエンドポイントのパフォーマンスに関する最新作を共有できることに嬉しく思います 😉。
チェックしてみてください: Laravel Resource Reducer 😎
Laravel Resource Reducerに触れる前に、既存のLaravel Resourceの欠点を理解することが重要です 👀。
Laravel Resource
皆さんはもうLaravel Resourceについて知っていますよね? もし知らなければ、ここで探ってみてください: https://laravel.com/docs/10.x/eloquent-resources
一番簡単な要約:
Laravel Resourceは、Eloquentをレスポンスに変換するためのレイヤです。
問題点
例えば、v1/users
というエンドポイントがユーザーの配列を返すとします:
[
'data' => [
[
'id' => 1,
'name' => 'Seth Phat',
'email' => 'me@sethphat.com',
'created_at' => '2023-01-01',
'role' => 'ADMIN',
'avatar_url' => '...',
],
[
// ... ユーザー2,
],
// ... その他多数
],
]
全画面モードにする
テーブルにユーザーを表示するようなリストページには全てが適しています。
しかし、別のページでユーザーのドロップダウンを使用したい場合(例えば、レビュアーとしてユーザーを割り当てるために)、返されるすべてのフィールドは必要ありません。idとnameだけ(または追加で、メールアドレス)が必要です。
=> 上記のエンドポイントを再利用する際のデメリット:
- 余分なフィールドが返されている 🥲
- レスポンスが遅くなる 🥲
- ドロップダウンのためだけに新しいエンドポイントを作成することになる 🥲 開発に時間がかかり、チームがさらにメンテナンスする必要がある 🥲
さらに、UserResource
に定義された関係があって、それらをレスポンスでまとめたい場合は、UserResource
を変換する前にイーガー読み込みを行う必要があります。すると、次のようなデメリットがあります:
- 外層で常にイーガー読み込みを行う必要がある 🥲
- そして、それを維持する 🥲
- n*n 応答サイズは、大量のデータで膨れ上がっています 🥲
- 間違いなく:レスポンスが遅くなる 🥲
これで現在の問題を理解したところで、素晴らしい解決策に飛び込みましょう 😎
Laravel Resource Reducerの登場
Laravel Resource Reducerは、すべてのAPIリクエストを最適化するのに役立ちます:
- 応答のサイズを減らし、必要なものだけを取得する ⭐️
- より速くAPIコンシューマーにレスポンスを提供 🚀
- 必要な時にのみ計算を開始し、CPUとメモリを節約 😎
- ドット表記を使用した組み込みの関係アクセス 👀
- ステロイドでイーガー読み込み(自動的なイーガー読み込み、N+1の問題なし)🔋
APIのレスポンス時間を飛躍的に向上させる、シンプルだけど超効果的な方法です 🥰
GraphQLについて知っているなら、データを問い合わせるためには、どのフィールドを取得したいかを定義する必要があります。Laravel Resource ReducerはGraphQLのアプローチから大きく影響を受けています。❤️
APIコンシューマーからの使用方法
例えば、v1/users
というエンドポイントがUser[]
を返すとします。
User
にはこれらのフィールドがあります:id, name, email, avatar_url, created_at, role(関連付けられた要素)
単に_f[]
または_fields[]
クエリパラメータを追加します:
id
、name
を取得するには:id
,email
, およびroleの名前(関係)を取得するには:
素晴らしいと思いませんか? 😎
実装
Resource Reducer
class UserResource extends JsonReducerResource
{
public function definitions(Request $request): array
{
return [
'id' => fn () => $this->id,
'email' => fn () => $this->email,
'created_at' => fn () => $this->created_at,
'role' => RoleResource::makeRelation('role'),
];
}
}
全画面モードにする
フィールドをクロージャでラップして、実行を遅延させることを忘れないでください 😎
レスポンスを返す
// UserController@index
return UserResource::collection($users)->response();
// UserController@show
return (new UserResource($user))->response();
全画面モードにする
使用方法はLaravel Resourceと同じです 😉
まとめ
このパッケージが役立つと思ったら、星を⭐️⭐️⭐️ください。
APIエンドポイントを最適化して、パフォーマンスを飛躍的に向上させるためにLaravel Resource Reducerの使用を検討してください 💪
ありがとうございました。素敵な一日を!
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/sethsandaru/optimizes-your-response-using-laravel-resource-reducer-49ni