Laravel 5.3 新特性系列 —— 更简单地自定义分页模板

laravel-5-3-new-features-updates

分页是网站开发中的通用功能,需要花费大量的时间去实现,Laravel 提供的分页库很智能,以前,自定义分页模板很简单,但是从Laravel 5.0(或者更早?)开始,为了让Laravel的分页库可以在非Laravel框架中使用,引入了更加复杂、但移植性更好的分页模板系统。不过从Laravel 5.3开始,将重新返璞归真。

Laravel 中分页如何工作

如果你对Laravel分页还不熟悉,下面我们通过一个简单的实例让你快速入门:

// routes file
Route::get('tasks', function () {
    return view('tasks.index')
        ->with('tasks', Task::paginate(10));
});
// resource/views/tasks/index.blade.php
@foreach ($tasks as $task)
    <!-- echo the task or whatever -->
@endforeach
{{ $tasks->links() }}

默认情况下,Eloquent对象上的 paginate() 方法会读取请求中的查询参数并判断所在的页面,所以在本例中,将会读取 ?page 参数然后抓取10条记录,然后在页面中通过循环遍历 $tasks 对象渲染数据。

如果你通过 paginate() 方法获取这10条记录而不是 all() ,就可以在$tasks对象上调用一个新方法links(),该方法会返回分页HTML代码:

<ul class="pagination">
<li class="disabled"><span>&laquo;</span></li><li class="active"><span>1</span></li>
<li><a href="http://laravelacademy.org?page=2">2</a></li>
<li><a href="http://laravelacademy.org?page=3">3</a></li>
<li><a href="http://laravelacademy.org?page=2" rel="next">&raquo;</a></li>
</ul>

Laravel 5.3 中自定义分页模板

还是接着上面的示例,你将如何在5.3中自定义上述分页模板?

默认情况下,分页模板可以在 Illuminate\Pagination 组件中找到: resources/views/bootstrap-3.blade.php ,也就是我们刚才看到的:

<ul class="pagination">
    <!-- Previous Page Link -->
    @if ($paginator->onFirstPage())
        <li class="disabled"><span>&laquo;</span></li>
    @else
        <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li>
    @endif<!-- Pagination Elements -->
    @foreach ($elements as $element)
        <!-- "Three Dots" Separator -->
        @if (is_string($element))
            <li class="disabled"><span>{{ $element }}</span></li>
        @endif

        <!-- Array Of Links -->
        @if (is_array($element))
            @foreach ($element as $page => $url)
                @if ($page == $paginator->currentPage())
                    <li class="active"><span>{{ $page }}</span></li>
                @else
                    <li><a href="{{ $url }}">{{ $page }}</a></li>
                @endif
            @endforeach
        @endif
    @endforeach

    <!-- Next Page Link -->
    @if ($paginator->hasMorePages())
        <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li>
    @else
        <li class="disabled"><span>&raquo;</span></li>
    @endif
</ul>

如果你想要自定义这个分页,有两种办法:发布内置的视图模板并进行编辑;或者你也可以创建一个新的文件并手动将分页器链接到这个文件。

发布文件

可能最简单的方式就是运行 php artisan vendor:publish ,这将会发布模板到 vendor/pagination 然后你就可以在这里编辑它,这是优先推荐的方式,除非你有一些特定的自定义需求。

手动链接文件

如果你选择创建一个新的分页文件并手动链接到它,复制一份默认的分页模板然后按照自己的需要对新文件进行编辑,然后将其保存在 resources/views ,接下来让我们来使用 resources/views/partials/pagination.blade.php

在服务提供者的boot()方法中运行 \Illuminate\Pagination\LengthAwarePaginator::defaultView('partials.paginator') ,以注册新的分页模板。

注:如果你想要自定义使用哪个模板,可以传递视图名称到links()方法: {{ $users->links('partials.paginator') }}

学院君

学院君 has written 548 articles

资深PHP工程师,Laravel学院院长