zzxworld

自定义 Laravel Pagination 分页访问地址

Laravel 的 Database 数据库模块默认提供了一个分页查询函数 paginate,它默认返回的翻页地址是 /path?page=1 这种格式,本文总结了该如何根据需要来自定义这个地址。

首先复制分页模板到项目的资源目录:

php artisan vendor:publish --tag=laravel-pagination

命令执行完成后,项目会多出一个 resources/views/vendor/pagination 目录。里面就是各种可用的分页模板。

resources/views/vendor/pagination
├── bootstrap-4.blade.php
├── default.blade.php
├── semantic-ui.blade.php
├── simple-bootstrap-4.blade.php
├── simple-default.blade.php
├── simple-tailwind.blade.php
└── tailwind.blade.php

不同的 Laravel 版本所包含的文件可能不同,以上是 7.2 版本的 Laravel 所包含的分页模板。在 7.2 版本中,Laravel 默认使用的分页模板为 bootstrap-4.blade.php。来看看这个文件中和页码相关的代码:

@if (is_array($element))
    @foreach ($element as $page => $url)
        @if ($page == $paginator->currentPage())
            <li class="page-item active" aria-current="page">
                <span class="page-link">{{ $page }}</span>
            </li>
        @else
            <li class="page-item">
                <a class="page-link" href="{{ $url }}">{{ $page }}</a>
            </li>
        @endif
    @endforeach
@endif

a 标签中 href 的属性修改为自己需要定义的地址就可以了。比如我之前文章默认的翻页地址格式是这样的:/posts?page=2,我想定义为 /posts/2 这种格式,就可以这样来修改:

<a class="page-link" href="/posts/{{ $page }}">{{ $page }}</a>

这样就等于是不使用分页对象提供的 $url 变量。同时也可以看出,要自定义 Laravel 分页地址更合理的方案应该是自定义一个数据分页对象,并重定义相关的方法。所以本文分享的只能算是一个「投机取巧」的方案,请自己衡量并谨慎使用。