Добавление пагинации к коллекциям, не относящимся к БД, в Laravel
Мощный класс Collection в Laravel предоставляет множество полезных методов для работы с массивами данных. Однако встроенный метод paginate
работает только с результатами построителя запросов Eloquent и базы данных.
Если вы хотите разбить на страницы стандартный экземпляр Laravel Collection, например, из массива или другого пользовательского источника данных, вам не повезло.
Определив пользовательский макрос, мы можем добавить возможности разбиения на страницы для любого экземпляра Collection в Laravel. Вот как это работает...
Определение макроса пагинации
Laravel позволяет вам определять пользовательские макросы для существующих классов, чтобы дополнить их новой функциональностью. Мы можем использовать это для создания многократно используемого макроса paginate
в классе Collection.
Внутри метода boot
сервис-провайдера, такого как AppServiceProvider
, мы определим макрос:
use Illuminate\Support\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
Collection::macro('paginate', function ($perPage = 15, $pageName = 'page', $page = null, $options = []) {
// Resolve current page from request
$page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
// Paginate the Collection
return new LengthAwarePaginator(
$this->forPage($page, $perPage),
$this->count(),
$perPage,
$page,
$options
);
});
Макрос создает новый экземпляр LengthAwarePaginator
, который будет обрабатывать логику рендеринга разбиения на страницы и ссылки. Нам просто нужно передать фрагмент данных конкретной страницы из коллекции с помощью forPage
, а также общее количество коллекций.
Пагинация коллекции
После определения макроса теперь мы можем разбить на страницы коллекции, не относящиеся к БД:
$collection = collect(range(1, 100)); // a Collection instance
$paginated = $collection->paginate(10); // 10 items per page
var_dump($paginated->items()); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] on page 1
Макрос справляется со всей сложностью разделения коллекции на страницы и создания экземпляра пагинатора.
Пользовательские сверхспособности пагинации!
Определение пользовательских макросов обеспечивает огромную гибкость для расширения базовых классов Laravel. В этом случае мы предоставили всем коллекциям возможность разбиения на страницы с помощью простого выразительного синтаксиса.
Хотя этот подход менее эффективен для больших наборов данных, он отлично подходит для небольших массивов или коллекций, не получаемых непосредственно из запроса к базе данных.
Так что не ограничивайтесь просто разбиением на страницы результатов Eloquent. С помощью магии макросов вы можете добавить возможности нумерации страниц в любую коллекцию Laravel!