📜  laravel 中的自定义分页 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:34.274000             🧑  作者: Mango

Laravel 中的自定义分页

在 Laravel 框架中,我们可以使用内置的 paginate() 函数来进行分页展示数据。但是,如果想要实现自定义的分页,我们也可以很容易地做到。

1. 自定义分页链接样式

通常情况下,使用内置的 paginate() 函数生成的分页链接样式都是一样的,如果希望自定义分页链接的样式,我们需要做下面这些步骤:

  1. config/app.php 文件中注册自定义的分页链接生成器:
'providers' => [
    // ...
    App\Providers\PaginationServiceProvider::class,
]
  1. 创建 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\">&laquo; 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 &raquo;</a></li>\n";
            }

            $html .= "    </ul>\n</div>\n";

            return $html;
        });

        // 配置分页链接生成器
        Paginator::defaultView('pagination::simple-default');
        Paginator::defaultSimpleView('pagination::simple-default');
    }
}
  1. 创建视图文件 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 变量名保持一致。

2. 自定义分页器

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 类的名称保持一致。