最近一年私下里写东西一直都是在使用 slim 框架,其实说是一直在写东西,但是到如今真的一点输出都没有,不太小技巧却是学会了很多,本身写个小验证器啊什么的,而且对于框架的一些理解也加深了,最好的是工做中不少都把这些小技巧用到了。php
好了,吐槽了这么多,我又要说句废话了,写了一年的东西才写到分页你敢信?不过这是真的,写了一年了,代码终于累计300行了,能够进入分页的过程了。前端
之前用 laravel 的时候以为 Eloquent 麻烦的很,麻烦不是指使用,而是指看代码麻烦,不过用起来仍是很爽的。因此当我在使用 slim 须要链接数据库的时候坚决果断就继续用了 Eloquent。laravel
当我写到分页的时候,发现调用方法失败,那么就继续引入 illuminate/pagination 好了。这下查询有问题不能正确获取页码,还有一些其余的参数也都是不对的,并且到前端的时候因为使用的模板是 twig,不能像 blade 模板那样在代码用调用 model 的相关方法,想要调用就得扩展 twig,那又是一桩麻烦事,既然如此,我就在代码中调用好了,而后在输出到模板中去,可是当我想偷懒使用 links 输出分页部分的时候报错了,在看报错,发现又得引入 blade 等一系列的东西,那引入了这么多,还不如直接使用 laravel 算了。因此,在使用 slim 不变的状况下,咱们就本身扩展一个分页方法吧。数据库
最初我是想继承 model 而后在里面写方法的,后来发现不行,不行的缘由是,model代用的大部分方法其实都是在 new 一个 builder 以后链式调用的,这里我又得多说一句了奥,laravel 中同一个类名,会在不少个包下都有的,本身查看的时候要当心别看错了。(其实,集成 model 也是能够的,就是太麻烦了,并且无法链式调用)框架
因此在继承 model 行不通以后,咱们就从 builder 入手,经过 google 和看代码能够找到这个方法ui
/** * Create a new Eloquent query builder for the model. * * @param \Illuminate\Database\Query\Builder $query * @return \Illuminate\Database\Eloquent\Builder|static */ public function newEloquentBuilder($query) { return new Builder($query); }
这个方法就是 model 里面产生新 builder 用的,那咱们就在咱们的 model 中 覆盖这个方法就行了。this
<?php namespace App\Model; use App\Model\Builder\CustomBuilder; use Illuminate\Database\Eloquent\Model; class Base extends Model { /** * Create a new Eloquent query builder for the model. * * @param \Illuminate\Database\Query\Builder $query * @return \Illuminate\Database\Eloquent\Builder|static */ public function newEloquentBuilder($query) { return new CustomBuilder($query); } }
注意代码里面的 builder 引用,别引用错了哦。google
好了,CustomBuilder 就是咱们自定义的 builder 了,spa
<?php namespace App\Model\Builder; use App\Utils\Paginate; use Illuminate\Database\Eloquent\Builder; class CustomBuilder extends Builder { public function myPaginate($perPage = 15, $columns = ['*']) { // 获取页码 $page = Paginate::getPageNum(); // 获取 总数 和 条目 $results = ($total = $this->toBase()->getCountForPagination()) ? $this->forPage($page, $perPage)->get($columns) : $this->model->newCollection(); // 计算总页数 $totalPage = $total ? ceil($total / $page) : 0; // 输出 return (object)[ 'currentPage' => $page, 'perPage' => $perPage, 'totalCount' => $total, 'totalPage' => $totalPage, 'data' => $results, ]; } }
能够看到咱们定义了一个 myPaginate
方法实现咱们的分页,其实这么作的目的只有一个覆盖自带分页在输出时候的一些操做,输出咱们想要的各类数据。接下来咱们就能够在代码和模板的任何地方使用咱们输出的数据,哪怕想实现 laravel 中 links
的方法,只要咱们扩展一下 twig 就ok了,具体怎么作呢,能够等着看下一篇文章了。code