DevGang
Авторизоваться

Оптимизируйте ваш ответ с помощью 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[]

Разве это не потрясающе?

Выполнение

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.

Источник:

#PHP #Laravel
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу