最近一年私下裏寫東西一直都是在使用 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