laravel-resource-reducer
laravel-resource-reducer copied to clipboard
Resource Reducer optimizes your API endpoint responses by return what consumers need, defer execution and no more BIG FAT JSON.
Laravel Resource Reducer from ShipSaaS
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 & 11
- 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
Usage
Laravel Resource Reducer is the SuperSet from Laravel Resource, thus we can use the Reducer just like the way we use normal Resource.
For detailed documentation & best practices, check out: Reducer Documentation
Resource Class
Simply migrate your Resource
class by extending ShipSaasReducer\Json\JsonReducerResource
, implement the
definitions
method.
The migration is 1:1 migration, no breaking changes 😉.
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,
];
}
}
Remember to wrap your accessor in a Closure/Callable. This ensures computation won't start on Runtime (wait for the right time 😉).
NOTE: remember to remove the toArray()
if you are migrating to JsonReducerResource
🥹, we handles magic there.
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();
From API consumers
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
Testing
Run composer test
😆
Available Tests:
- Unit Testing
- Feature Testing
Contributors
- Seth Phat
Contributions & Support the Project
Feel free to submit any PR, please follow PSR-1/PSR-12 coding conventions and testing is a must.
If this package is helpful, please give it a ⭐️⭐️⭐️. Thank you!
License
MIT License