DEV Community

Cover image for πŸ”‹ Laravel Resource Reducer: optimizes your API responses
Seth Phat
Seth Phat

Posted on

πŸ”‹ Laravel Resource Reducer: optimizes your API responses

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

GitHub Repository: https://github.com/shipsaas/laravel-resource-reducer

Documentation: https://reducer.shipsaas.tech/

Ever thinking about how to speed up your application by optimizing the response? πŸ‘€

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

  • Reduce the response's size, get what you need ⭐️
    • Defer execution and allow on-demand data
  • Responses to consumers faster πŸš€
    • No more BIG FAT JSON every item/request
  • Computation only starts when requires, 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. ❀️

Supports

  • Laravel 10+
  • PHP 8.2+

Compatibility

  • Single Eloquent Model βœ…
  • Collection of Eloquent Models βœ…
  • Pagination βœ… (🟑 we have to use Resource::collection for the time being)
  • (Planned) Collection of Arrays
  • (Planned) Collection of Objects

Installation

composer require shipsaas/laravel-resource-reducer
Enter fullscreen mode Exit fullscreen mode

API Consumer Usage

Use the query _f or _fields, Reducer supports both ways:

  • http://api/users?_f=id,name,role.name,created_at
  • http://api/users?_fields[]=id,_fields[]=email

No more unnecessary fields and faster response TODAY 😎

Backend Implementation

Resource Class

Same as Laravel Resource, using our JsonReducerResource as the parent class.

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

Remember to wrap your accessor in a Closure/Callable.
This ensures computation won't start (wait for the right time πŸ˜‰).

Return the data

Same as today as how we are using Laravel Resource:

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

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

Conclusion

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

Top comments (0)