Класс Paginator
Класс Paginator является частью системы пагинации Laravel и предназначен для создания постраничной навигации, когда не требуется знать общее количество элементов. В отличие от LengthAwarePaginator, этот класс не предоставляет информацию о последней странице и общем количестве записей, что делает его идеальным для работы с большими наборами данных, где подсчёт общего количества может быть затратным. Класс принимает в конструктор коллекцию элементов, количество элементов на странице и текущую страницу, а также опциональный базовый URL.
Синтаксис
<?php
new Paginator($items, $perPage, $currentPage, $options);
?>
Параметр $items содержит коллекцию элементов для текущей страницы, $perPage определяет количество элементов на странице, $currentPage указывает текущую страницу, а $options позволяет передать дополнительные настройки, такие как путь к страницам.
Создание пагинатора через метод make
Laravel предоставляет удобный фасадный метод Paginator::make для создания экземпляра пагинатора:
<?php
use IlluminatePaginationPaginator;
$items = ['item 1', 'item 2', 'item 3', 'item 4', 'item 5'];
$perPage = 2;
$currentPage = 1;
$paginator = Paginator::make($items, $perPage, $currentPage, [
'path' => '/users'
]);
foreach ($paginator as $item) {
echo $item;
}
?>
Результат выполнения кода:
"item 1"
"item 2"
Использование в контроллере
Рассмотрим пример использования класса Paginator в контроллере для пагинации массива данных:
<?php
namespace AppHttpControllers;
use IlluminatePaginationPaginator;
class UserController extends Controller
{
public function index()
{
$users = ['user 1', 'user 2', 'user 3', 'user 4', 'user 5'];
$perPage = 2;
$currentPage = request()->get('page', 1);
$offset = ($currentPage - 1) * $perPage;
$items = array_slice($users, $offset, $perPage);
$paginator = Paginator::make($items, $perPage, $currentPage, [
'path' => '/users'
]);
return view('users.index', ['users' => $paginator]);
}
}
?>
Теперь передадим пагинатор в Blade-шаблон для отображения:
@foreach ($users as $user)
<div>{{ $user }}</div>
@endforeach
{{ $users->links() }}
Результат выполнения кода:
<div>user 1</div>
<div>user 2</div>
<ul class="pagination">
<li class="disabled"><span>«</span></li>
<li class="active"><span>1</span></li>
<li><a href="/users?page=2">2</a></li>
<li><a href="/users?page=3">3</a></li>
<li><a href="/users?page=2" rel="next">»</a></li>
</ul>
Метод withPath для изменения базового пути
Метод withPath позволяет изменить базовый URL для всех ссылок пагинации:
<?php
use IlluminatePaginationPaginator;
$items = ['article', 'user', 'category'];
$perPage = 1;
$currentPage = 1;
$paginator = Paginator::make($items, $perPage, $currentPage);
$paginator->withPath('/admin/users');
echo $paginator->url(2);
?>
Результат выполнения кода:
"/admin/users?page=2"
Метод appends для добавления параметров запроса
Метод appends добавляет дополнительные параметры к ссылкам пагинации:
<?php
use IlluminatePaginationPaginator;
$items = ['abcde', 'fghij', 'klmno'];
$perPage = 1;
$currentPage = 1;
$paginator = Paginator::make($items, $perPage, $currentPage, [
'path' => '/search'
]);
$paginator->appends(['sort' => 'desc']);
echo $paginator->url(2);
?>
Результат выполнения кода:
"/search?page=2&sort=desc"
Метод onFirstPage для проверки первой страницы
Метод onFirstPage проверяет, находится ли пагинатор на первой странице:
<?php
use IlluminatePaginationPaginator;
$items = ['item 1', 'item 2', 'item 3'];
$perPage = 2;
$currentPage = 1;
$paginator = Paginator::make($items, $perPage, $currentPage);
if ($paginator->onFirstPage()) {
echo "On first page";
} else {
echo "Not on first page";
}
?>
Результат выполнения кода:
"On first page"
Метод hasMorePages для проверки наличия следующих страниц
Метод hasMorePages проверяет, существуют ли ещё страницы после текущей:
<?php
use IlluminatePaginationPaginator;
$items = ['item 1', 'item 2', 'item 3', 'item 4'];
$perPage = 2;
$currentPage = 1;
$paginator = Paginator::make($items, $perPage, $currentPage);
if ($paginator->hasMorePages()) {
echo "Has more pages";
} else {
echo "No more pages";
}
?>
Результат выполнения кода:
"Has more pages"
Смотрите также
-
класс
LengthAwarePaginator,
который предоставляет информацию об общем количестве записей -
класс
CursorPaginator,
который использует курсоры для эффективной пагинации -
метод
links,
который выводит ссылки для постраничной навигации -
метод
appends,
который добавляет параметры к ссылкам пагинации