Laravelでは、データの一覧表示に便利なページネーション機能が標準で用意されています。初期状態でも十分に使えますが、デザインやURL構造、表示形式を自由にカスタマイズしたいケースも多くあります。この記事では、Laravelのページネーションを自在にカスタマイズする方法を、実用的なコード例とともに解説します。
基本的なページネーションの使い方
Laravelでは、Eloquentやクエリビルダでpaginate()
メソッドを使うだけで簡単にページネーションが可能です。
$users = User::paginate(10);
return view('user.index', compact('users'));
Bladeテンプレート内でlinks()
を使えば、ページリンクが自動生成されます。
{{ $users->links() }}
ページネーションのデザインをカスタマイズ
LaravelのページネーションはBootstrap向けのデザインがデフォルトですが、Tailwindやオリジナルのデザインにも対応できます。
Tailwindに切り替える
AppServiceProvider
のboot()
メソッド内で指定します。
use Illuminate\Pagination\Paginator;
public function boot()
{
Paginator::useTailwind();
}
カスタムビューを指定する
以下のようにlinks()
に引数を渡すことで、独自のBladeテンプレートを使ったデザインが可能です。
{{ $users->links('pagination.custom') }}
resources/views/pagination/custom.blade.php
に自由なHTML構造でページネーションを定義できます。
現在のページや総ページ数を取得してカスタム表示
Blade内でページ情報を使って「1 / 5ページ」のように表示することも可能です。
現在 {{ $users->currentPage() }} / {{ $users->lastPage() }} ページ
URLパラメータを維持したままページネーションする方法
検索フォームやフィルターと組み合わせる場合、ページ遷移時にもクエリパラメータを維持する必要があります。
{{ $users->appends(request()->query())->links() }}
これにより、?keyword=検索語&page=2
のようなURLが自動的に生成されます。
ページネーションのURL構造をカスタマイズ
URL構造を変更したい場合は、ルーティングとpaginate()
の組み合わせに工夫が必要です。たとえば、/users/page/2
のような構造にする場合は、以下のようなルートを定義します。
Route::get('/users/page/{page?}', [UserController::class, 'index'])->name('users.index');
コントローラ側でページ番号を明示的に指定してクエリを構築することも可能です。
$perPage = 10;
$page = $request->input('page', 1);
$users = User::paginate($perPage, ['*'], 'page', $page);
ページネーションの表示数やリンク数を調整
リンクの表示数(前後何件表示するか)を細かく調整したい場合は、カスタムコンポーネントを作成するのが一般的です。Tailwind使用時は、vendor/laravel/framework/src/Illuminate/Pagination/resources/views/tailwind.blade.php
をコピーしてカスタマイズすることもできます。
まとめ
Laravelのページネーションは、標準機能でも十分に実用的ですが、より使いやすいUIやSEOを意識したURL設計のためには、適切なカスタマイズが不可欠です。デザイン、リンク形式、クエリの保持など、プロジェクトの要件に合わせて柔軟に調整していきましょう。