⭐️ Laravel Resource Reducerを使ってレスポンスを最適化しよう

Cover image for ⭐️ Optimizes your response using 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[]クエリパラメータを追加します:

素晴らしいと思いませんか? 😎

実装

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