关于 Laravel 项目 伪静态分页处理

2022-05-15 0 986

下面由Laravel教程栏目给大家介绍Laravel 项目 伪静态分页处理 ,希望对需要的朋友有所帮助!

手上有个 Laravel 的项目,要求做伪静态处理,项目中使用了 Laravel 自带的分页组件,分页组件分页会在你的 URL 用 Query 的方式做页码的传递,达不到伪静态的要求。

想要的效果

我们伪静态想要的效果大体是这样的:

 /software/3dmax/created_at/page-1.html

对应 Laravel 的路由是:

/software/{category}/{order}/page-{page}.html

因为 Laravel 路由本身是支持路由参数的,所以说 我们变量的获取是完全没有问题的,但是 Laravel 自带的分页组件会将你的 参数 用 Query 的方式做传递,所以生成的分页地址是下面这种

 /software/3dmax/created_at/page-1.html?category=3dmax&order=created_at&page=2

这不是我们需要的,所以我们需要对 Laravel 自带的分页组件进行修改。

Laravel 分页组件

在 Laravel 中我们如果需要分页,会调用 模型中的 paginate 方法,然后传递每页的页码。

paginate 方法会调用 Illuminate\\Database\\Concerns\\BuildsQueries 下的paginator方法。paginator 方法会构造一个 Illuminate\\Pagination\\LengthAwarePaginator的实例。Illuminate\\Pagination\\LengthAwarePaginator 会使用 Illuminate\\Pagination\\AbstractPaginator 中的url方法进行构造请求参数和url。

现在我们找到生成 URL 的地方了,我们需要做的就是在这里修改。

重写分页组件

Laravel 中本身支持自定义分页组件,But 我们做的不是自定义分页,我们需要对于方法进行重写。

创建 LengthAwarePaginator 类

mkdir app/Paginationtouch app/Pagination/LengthAwarePaginator.php

文件 app/Pagination/LengthAwarePaginator.php 内容:

<?phpnamespace App\\Pagination;use Illuminate\\Support\\Arr;use Illuminate\\Support\\Str;use Illuminate\\Pagination\\LengthAwarePaginator as BasePaginator;class LengthAwarePaginator extends BasePaginator{}

重写 Url 方法

首先 Laravel 自带的分页 会把路由里面的参数放到 Query中,我们需要的是 参数还是放到地址中。

获取到所有的 query 参数判断需要分页的页面路由中是否有绑定的路由参数如果没有的话,我们就走 Laravel 本身的分页如果有的话,我们就通过路由和路由参数进行构建地址,并把它从 query 参数中剔除判断下当前的 query 参数中是否还有参数,如果还有的话,我们就和之前一样。

修改 app/Pagination/LengthAwarePaginator.php下内容:

...public function url($page)    {        if ($page <= 0) {            $page = 1;        }        $parameters = [$this->pageName => $page];        if (count($this->query) > 0) {            $parameters = array_merge($this->query, $parameters);        }        //判断的参数是否在 路由中 需要绑定的数据        $params = \\request()->route()->parameters();        if (!empty($params)) {            foreach ($parameters as $key => $parameter) {                if (isset($params[$key])) {                    $params[$key] = $parameter;                    unset($parameters[$key]);                }            }            $path = route(\\request()->route()->getAction('as'), $params);        } else {            $path = $this->path;        }        // 判断是否有参数        if (empty(Arr::query($parameters))) {            return $path . $this->buildFragment();        }        return $path            . (Str::contains($this->path, '?') ? '&' : '?')            . Arr::query($parameters)            . $this->buildFragment();    }    ...

使用自定义的分页组件

在 Laravel 中我们如果需要分页,会调用 模型中的 paginate 方法,但是paginate方法的定义在Illuminate\\Database\\Eloquent\\Builder下,如果我们需要重写的话,会很麻烦,并且还有一个问题就是,并不是我们所有的分页都是需要伪静态的,比如我们用户中心的数据可能不太需要伪静态。所以我们需要一个可以手动设置的东西,Larave 模型中有一个 本地作用域,我们可以写一个方法staticPaginate,当需要使用静态分页的时候,我们可以Model->query()->staticPaginate(); 来调用,所需要的参数和 Laravel 自带的 pageinage 方法类似。

公共的Model 基类文件

Laravel项目中的 Model 我们一般不会直接继承Illuminate\\Database\\Eloquent\\Model 我们一般都在 app\\Models 目录定义一个 Model 基类,所有的模型都继承自 Model 基类,这并不是必须的,只是这样的话对于模型修改,或添加公共的方法比较方便。

在模型中定义本地作用域

你只需要拷贝 Illuminate\\Database\\Eloquent\\Builder下的paginate方法的内容并修改$this的指向就可以了

...use Illuminate\\Pagination\\Paginator;# Laravel 自带的。use Illuminate\\Contracts\\Pagination\\LengthAwarePaginator;...   /**     * 自定义静态分页     * @author kingofzihua     * @param Builder $builder     * @param int $perPage     * @param array $columns     * @param string $pageName     * @param int|null $page     * @return LengthAwarePaginator     *     * @throws \\InvalidArgumentException     */    public function scopeStaticPaginate($builder, $perPage = null, $columns = ['*'], $pageName = 'page', $page = null)    {        if (request('page')) {            request()->offsetSet('page', request('page'));        }        $page = $page ?: Paginator::resolveCurrentPage($pageName);        $perPage = $perPage ?: $builder->getModel()->getPerPage();        $results = ($total = $builder->toBase()->getCountForPagination())            ? $builder->forPage($page, $perPage)->get($columns)            : $builder->getModel()->newCollection();        return $this->paginator($results, $total, $perPage, $page, [            'path' => Paginator::resolveCurrentPath(),            'pageName' => $pageName,        ]);    }    ...

替换自定义的分页组件

# 替换use App\\Pagination\\LengthAwarePaginator;# --- use  Illuminate\\Contracts\\Pagination\\LengthAwarePaginator;  // 注释...   /**     *     * @param \\Illuminate\\Support\\Collection $items     * @param int $total     * @param int $perPage     * @param int $currentPage     * @param array $options     * @return LengthAwarePaginator     */    protected function paginator($items, $total, $perPage, $currentPage, $options)    {        return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(            'items', 'total', 'perPage', 'currentPage', 'options'        ));    }    ...

在项目中使用静态分页组件

Model::query()->staticPaginate($pageSize);

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 关于 Laravel 项目 伪静态分页处理 https://www.jike1995.com/36483.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务