slim3使用Eloquent自定义分页

最近一年私下里写东西一直都是在使用 slim 框架,其实说是一直在写东西,可是到现在真的一点输出都没有,不过小技巧倒是学会了不少,自己写个小验证器啊什么的,并且对于框架的一些理解也加深了,最好的是工作中很多都把这些小技巧用到了。

好了,吐槽了这么多,我又要说句废话了,写了一年的东西才写到分页你敢信?不过这是真的,写了一年了,代码终于累计300行了,可以进入分页的过程了。

以前用 laravel 的时候觉得 Eloquent 麻烦的很,麻烦不是指使用,而是指看代码麻烦,不过用起来还是很爽的。所以当我在使用 slim 需要连接数据库的时候毫不犹豫就继续用了 Eloquent。

当我写到分页的时候,发现调用方法失败,那么就继续引入 illuminate/pagination 好了。这下查询有问题不能正确获取页码,还有一些其他的参数也都是不对的,而且到前端的时候由于使用的模板是 twig,不能像 blade 模板那样在代码用调用 model 的相关方法,想要调用就得扩展 twig,那又是一桩麻烦事,既然如此,我就在代码中调用好了,然后在输出到模板中去,但是当我想偷懒使用 links 输出分页部分的时候报错了,在看报错,发现又得引入 blade 等一系列的东西,那引入了这么多,还不如直接使用 laravel 算了。所以,在使用 slim 不变的情况下,我们就自己扩展一个分页方法吧。

最初我是想继承 model 然后在里面写方法的,后来发现不行,不行的原因是,model代用的大部分方法其实都是在 new 一个 builder 之后链式调用的,这里我又得多说一句了奥,laravel 中同一个类名,会在很多个包下都有的,自己查看的时候要小心别看错了。(其实,集成 model 也是可以的,就是太麻烦了,而且没法链式调用)

所以在继承 model 行不通之后,我们就从 builder 入手,通过 google 和看代码可以找到这个方法

/**
  * 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 中 覆盖这个方法就好了。

<?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 引用,别引用错了哦。

好了,CustomBuilder 就是我们自定义的 builder 了,

<?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了,具体怎么做呢,可以等着看下一篇文章了。


写代码的大胖
一个喜欢写 php 的胖子

php 初心者

70 声望
2 粉丝
0 条评论
推荐阅读
如何使用 PHPStorm 进行优雅的项目开发?
PHP Storm 这个开发工具,很多 phper 应该有所耳闻,甚至也有不少人使用其作为生产工具,但是很多人都没有最大限度的使用它,本文就来总结一些优雅开发的小技巧。

唯一丶45阅读 4.8k评论 7

怎样用 PHP 来实现枚举?
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,...

唯一丶25阅读 6.3k评论 4

图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

TANKING7阅读 11.2k评论 5

Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2k评论 2

封面图
微信公众号开发:自动回复文本/图片/图文消息/关键词回复/上传素材/自定义菜单
对接流程1、申请微信公众号测试账号URL:[链接]2、登录,配置开发者服务器URL和Token开发者服务器配置代码:config.php {代码...} URL是config.php在你服务器的URLToken是上面代码自己设置的Token搞定之后,就能完...

TANKING2阅读 10k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go4阅读 944评论 2

封面图
Ajax实现搜索联想 搜索关键词提醒 无刷新搜索
通过javascript监听搜索框的内容,调用后端即可。(1)javascript监听搜索框的内容(2)把搜索框的关键词传给后端进行搜索(3)搜索到结果,遍历到页面

TANKING1阅读 4.3k

php 初心者

70 声望
2 粉丝
宣传栏