Оптимизируйте ваш ответ с помощью Laravel Resource Reducer
Привет, ребята, Я рад поделиться своей последней работой по повышению производительности ваших конечных точек API Laravel.
Ознакомьтесь с: Laravel Resource Reducer.
Прежде чем углубляться в Laravel Resource Reducer, важно понять недостатки существующего Laravel Resource.
Laravel Resource
Я предполагаю, что вы все уже знакомы с Laravel Resource, не так ли? Если нет, вы можете изучить это здесь: https://laravel.com/docs/10.x/eloquent-resources
Простыми словами:
Laravel Resource — это слой для вычисления красноречия в ответах.
Проблемы
Допустим, у нас есть конечная точка v1/users
, которая возвращает массив пользователей:
[
'data' => [
[
'id' => 1,
'name' => 'Seth Phat',
'email' => 'me@sethphat.com',
'created_at' => '2023-01-01',
'role' => 'ADMIN',
'avatar_url' => '...',
],
[
// ... user 2,
],
// ... more
],
]
Для страницы листинга подходит все, например, отображение пользователей в таблице.
Однако, если мы хотим использовать раскрывающийся список пользователей на другой странице (например, чтобы назначить пользователя рецензентом), то вам не потребуются все возвращаемые поля, вам нужны только: id
и name
(или дополнительно, email
)
Минусы при повторном использовании указанной выше конечной точки:
- Возвращены избыточные поля.
- Медленный ответ.
- В конечном итоге вы создадите новую конечную точку только для раскрывающегося списка.
- Разработка занимает больше времени, и команде приходится поддерживать больше кода.
Более того, если у вас есть отношения, определенные в вашем UserResource
, и вы хотите объединить их в ответе, вам нужно будет выполнить быструю загрузку перед преобразованием UserResource
, поэтому у вас будут следующие минусы:
- Всегда нужно выполнять нетерпеливую загрузку во внешнем слое.
- Размер ответа n*n, потому что он переполнен огромными данными.
- Более медленный ответ.
Теперь, когда вы знаете текущие проблемы. Давайте перейдем к решению.
Знакомство с Laravel Resource Reducer
Laravel Resource Редуктор поможет вам оптимизировать каждый запрос API:
- Уменьшение размер ответа.
- Быстрые ответы потребителям API.
- Вычисления запускаются только при необходимости, экономьте процессор и память.
- Встроенный доступ к отношениям с использованием точечной записи.
- Нетерпеливая загрузка стероидами (автоматическая нетерпеливая загрузка, больше нет боли N+1).
Простой, но очень эффективный метод резкого увеличения времени ответа вашего API.
Если вы знаете о GraphQL, для запроса данных нам нужно определить, какие поля мы хотим получить. Laravel Resource Reducer во многом основан на подходе GraphQL.
Использование (от API потребителя)
Допустим, у нас есть конечная точка: v1/users
, которая возвращает User[]
У User
есть следующие поля: id
, name
, email
, avatar_url
, created_at
, role
(relationship
).
Просто добавьте параметр запроса _f[]
или _fields[]
- Получить
id
,name
: https://my-api.com/v1/users?_fields[]=id&_fields[]=name - Получите
id
,email
иrole name
(отношения):
https://my-api.com/v1/users?_f=id,email,role.name
Разве это не потрясающе?
Выполнение
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'),
];
}
}
Не забудьте заключить поля в замыкания, чтобы отложить выполнение.
Возвратные ответы
// UserController@index
return UserResource::collection($users)->response();
// UserController@show
return (new UserResource($user))->response();
Использование такое же, как Laravel Resource.
Заключительные слова
Рассмотрите возможность использования Laravel Resource Reducer для оптимизации и резкого увеличения количества конечных точек API.