📅  最后修改于: 2023-12-03 15:32:34.274000             🧑  作者: Mango
在 Laravel 框架中,我们可以使用内置的 paginate()
函数来进行分页展示数据。但是,如果想要实现自定义的分页,我们也可以很容易地做到。
通常情况下,使用内置的 paginate()
函数生成的分页链接样式都是一样的,如果希望自定义分页链接的样式,我们需要做下面这些步骤:
config/app.php
文件中注册自定义的分页链接生成器:'providers' => [
// ...
App\Providers\PaginationServiceProvider::class,
]
app/Providers/PaginationServiceProvider.php
文件,内容如下:<?php
namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class PaginationServiceProvider extends ServiceProvider
{
public function boot()
{
// 分页链接样式的 Blade 指令
Blade::directive('custom_pagination', function ($paginator) {
$path = $paginator->path();
$html = "<div class=\"pagination\">\n <ul>\n";
if ($paginator->currentPage() > 1) {
$previousPageUrl = $paginator->url((int) $paginator->currentPage() - 1);
$html .= " <li><a href=\"{$previousPageUrl}\" class=\"prev\">« Previous</a></li>\n";
}
foreach ($paginator->getUrlRange(1, $paginator->lastPage()) as $page => $url) {
$active = ($paginator->currentPage() == $page) ? ' class="active"' : '';
$html .= " <li{$active}><a href=\"{$url}\">{$page}</a></li>\n";
}
if($paginator->currentPage() < $paginator->lastPage()) {
$nextPageUrl = $paginator->url($paginator->currentPage() + 1);
$html .= " <li><a href=\"{$nextPageUrl}\" class=\"next\">Next »</a></li>\n";
}
$html .= " </ul>\n</div>\n";
return $html;
});
// 配置分页链接生成器
Paginator::defaultView('pagination::simple-default');
Paginator::defaultSimpleView('pagination::simple-default');
}
}
resources/views/vendor/pagination/simple-default.blade.php
,内容如下:@if ($paginator->hasPages())
{!! str_replace('<ul class=\'pagination\'>', '', $paginator->render('custom_pagination', ['paginator' => $paginator])) !!}
@endif
在 custom_pagination
指令中使用的 $paginator
变量需要和视图文件中传递的 $paginator
变量名保持一致。
Laravel 默认提供的 LengthAwarePaginator
类可以满足大部分分页需求,但是,我们也可以通过扩展其它分页器来实现自定义分页器。
假设我们有一个名为 CustomPaginator
的自定义分页器,我们可以按照下面的方式实现:
<?php
namespace App;
use Illuminate\Pagination\LengthAwarePaginator;
class CustomPaginator extends LengthAwarePaginator
{
// 扩展自定义的分页器方法
}
我们也需要为分页器生成器添加一个 CustomPaginationProvider
服务提供器,内容如下:
<?php
namespace App\Providers;
use App\CustomLengthAwarePaginator;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class CustomPaginationProvider extends ServiceProvider
{
public function boot()
{
Blade::directive('custom_pagination', function ($paginator) {
// ...
});
Paginator::defaultView('pagination::simple-default');
Paginator::defaultSimpleView('pagination::simple-default');
// 添加自定义分页器生成器
Paginator::macro('custom', function ($items, $perPage, $currentPage = null, $options = []) {
$paginator = new CustomPaginator($items, $perPage, $currentPage, $options);
return $paginator->withPath(Paginator::resolveCurrentPath());
});
}
}
在 CustomPaginator
类中需要扩展一些方法来满足我们的需求。在 CustomPaginationProvider
服务提供器中使用的分页器名称需要和 CustomPaginator
类的名称保持一致。