DEV Community

Cover image for ⭐️ Optimizes your response using Laravel Resource Reducer
Seth Phat
Seth Phat

Posted on

⭐️ Optimizes your response using Laravel Resource Reducer

Hey guys,

I'm delighted to share my latest work on the performance of your Laravel API endpoints 😉.

Check out: Laravel Resource Reducer 😎

Before delving into Laravel Resource Reducer, it's essential to understand the drawbacks of the existing Laravel Resource 👀.

Laravel Resource

I assume that you all are already familiar with Laravel Resource, aren't you? If not, you can explore it here: https://laravel.com/docs/10.x/eloquent-resources

Simplest tl;dr:

Laravel Resource is a layer to compute your Eloquents into the Responses

Problems

Let's say, we have an endpoint v1/users which returns an array of users:

[
    'data' => [
        [
            'id' => 1,
            'name' => 'Seth Phat',
            'email' => 'me@sethphat.com',
            'created_at' => '2023-01-01',
            'role' => 'ADMIN',
            'avatar_url' => '...',
        ],
        [
            // ... user 2,
        ],
        // ... more
    ],
]
Enter fullscreen mode Exit fullscreen mode

Everything is suitable for the listing page, such as rendering users in the table.

However, if we want to use a dropdown of users on another page (for example, to assign a user as a reviewer), then, you won't need all the returned fields, you only need: id & name (or additionally, email)

=> The CONs while reusing the above endpoint:

  • Redundant fields returned 🥲
  • Slower response 🥲
  • You will end up creating a new endpoint just for the dropdown 🥲 Development takes more time & the team has to maintain more 🥲

Moreover, if you have relationship(s) defined in your UserResource and you wish to bulk them up in the response, then you will need to do eager-loading before transforming UserResource, thus you'll have these CONs:

  • Always need to do the eager-loading in the outer layer 🥲
    • And maintain that 🥲
  • n*n response size because it bulked up with enormous data 🥲
  • Definitely: slower response 🥲

Now that you know the current problems. Let's jump into the super solution 😎

Meets Laravel Resource Reducer

Laravel Resource Reducer helps you to optimize every API request by:

  • Reduce the response's size, get what you need ⭐️
  • Responses to API consumers faster 🚀
  • Computation only starts when required, save CPU & memory 😎
  • Built-in relationship access by using dot notation 👀
  • Eager-loading on steroids (automated eager-loading, no more N+1 pain) 🔋

A simple yet super effective method to skyrocketing your API responding times 🥰

If you know about GraphQL, To query for data, we need to define which fields we want to retrieve. Laravel Resource Reducer is heavily inspired from GraphQL approach. ❤️

Usage (from API Consumer)

Let's say, we have this endpoint: v1/users which returns User[]

User has these fields: id, name, email, avatar_url, created_at, role (relationship)

Simply add _f[] or _fields[] query param

Isn't it awesome? 😎

Implementation

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'),
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

Remember to wrap your fields with in closures, to defer execution 😎

Return responses

// UserController@index
return UserResource::collection($users)->response();

// UserController@show
return (new UserResource($user))->response();
Enter fullscreen mode Exit fullscreen mode

The usage is as same as Laravel Resource 😉

Final words

If this package is helpful, please give it a ⭐️⭐️⭐️.

Consider using Laravel Resource Reducer to optimize & skyrocket your API endpoints 💪

Thank you and have a great day!

Top comments (2)

Collapse
 
mishajib profile image
MI Shajib

Nice solution

Collapse
 
sethsandaru profile image
Seth Phat

thanks mate 💪