Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

Resource Reducer optimizes your API endpoint responses by return what consumers need, defer execution and no more BIG FAT JSON.
https://github.com/shipsaas/laravel-resource-reducer

laravel laravel-10 laravel-library optimization php reducer

Last synced: about 2 months ago
JSON representation

Resource Reducer optimizes your API endpoint responses by return what consumers need, defer execution and no more BIG FAT JSON.

Awesome Lists containing this project

README

        

# Laravel Resource Reducer from ShipSaaS

[![Build & Test (PHP 8.2 + Laravel 10+)](https://github.com/shipsaas/laravel-resource-reducer/actions/workflows/build.yml/badge.svg)](https://github.com/shipsaas/laravel-resource-reducer/actions/workflows/build.yml)
[![codecov](https://codecov.io/gh/shipsaas/laravel-resource-reducer/graph/badge.svg?token=alt8CdVUg1)](https://codecov.io/gh/shipsaas/laravel-resource-reducer)

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

```bash
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](https://reducer.shipsaas.tech)

### 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 😉.

```php
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:

```php
// 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