我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Laravel项目中伪静态分页处理的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Laravel项目中伪静态分页处理的示例分析

这篇文章给大家分享的是有关Laravel项目中伪静态分页处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

下面由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;...       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;  // 注释...       protected function paginator($items, $total, $perPage, $currentPage, $options)    {        return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(            'items', 'total', 'perPage', 'currentPage', 'options'        ));    }    ...

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

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

感谢各位的阅读!关于“Laravel项目中伪静态分页处理的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Laravel项目中伪静态分页处理的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Laravel项目中伪静态分页处理的示例分析

这篇文章给大家分享的是有关Laravel项目中伪静态分页处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面由Laravel教程栏目给大家介绍Laravel 项目 伪静态分页处理 ,希望对需要的朋友
2023-06-06

Hive中静态分区与动态分区的示例分析

这篇文章给大家分享的是有关Hive中静态分区与动态分区的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行
2023-06-02

Java中动态代理和静态代理的示例分析

这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri
2023-06-29

Django中静态文件与模板的示例分析

这篇文章主要介绍了Django中静态文件与模板的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。模板之前我们的视图函数test使用了HttpResponse返回一个字符
2023-06-29

PHP中使用后期静态绑定的示例分析

这篇文章给大家分享的是有关PHP中使用后期静态绑定的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。后期静态绑定在PHP中的使用什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个
2023-06-15

JDK中动态代理的示例分析

这篇文章将为大家详细讲解有关JDK中动态代理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态代理步骤1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法2.创
2023-06-15

java中多态原理的示例分析

这篇文章将为大家详细讲解有关java中多态原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发
2023-06-14

项目中Axios二次封装的示例分析

这篇文章主要介绍项目中Axios二次封装的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.为什么做封装?方便代码整体调用、对请求做公共处理、个性化定制2.别人已经封装了很多,为什么不直接修改使用?封装思路不
2023-06-15

Java中异常处理的示例分析

这篇文章主要介绍Java中异常处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异常的定义在java中,异常就是java在编译、运行或运行过程中出现的错误总共有三种:1.编译错误 2.运行错误 3.逻辑错误
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录