DEV Community

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

Posted on

1 1 1 1 1

πŸ”‹ 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!

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More