iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Laravel项目中伪静态分页处理的示例分析
  • 799
分享到

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

2023-06-06 10:06:23 799人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关Laravel项目中伪静态分页处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面由Laravel教程栏目给大家介绍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项目中伪静态分页处理的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Laravel项目中伪静态分页处理的示例分析

本文链接: https://www.lsjlt.com/news/246599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Laravel项目中伪静态分页处理的示例分析
    这篇文章给大家分享的是有关Laravel项目中伪静态分页处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面由Laravel教程栏目给大家介绍Laravel 项目 伪静态分页处理  ,希望对...
    99+
    2023-06-06
  • web开发中页面静态化的示例分析
    这篇文章给大家分享的是有关web开发中页面静态化的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   public void GenerathHtmlByString(...
    99+
    2024-04-02
  • Hive中静态分区与动态分区的示例分析
    这篇文章给大家分享的是有关Hive中静态分区与动态分区的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行...
    99+
    2023-06-02
  • Java中动态代理和静态代理的示例分析
    这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri...
    99+
    2023-06-29
  • vue中静态路由的示例分析
    这篇文章将为大家详细讲解有关vue中静态路由的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路...
    99+
    2024-04-02
  • html中tags标签关键词url以ID伪静态的示例分析
    这篇文章主要介绍html中tags标签关键词url以ID伪静态的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 1、nginx伪动态划定rewrite ^(.*)...
    99+
    2024-04-02
  • java访问者模式的静态动态及伪动态分派实例分析
    今天小编给大家分享一下java访问者模式的静态动态及伪动态分派实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 使用...
    99+
    2023-07-02
  • Bootstrap jquery.twbsPagination.js动态页码分页的示例分析
    这篇文章主要为大家展示了“Bootstrap jquery.twbsPagination.js动态页码分页的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
    99+
    2024-04-02
  • Linux动态库和静态库的示例分析
    今天就跟大家聊聊有关Linux动态库和静态库的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数库分为静态库和动态库两种。创建Linux静态库和Linux动态库和使用它们在这...
    99+
    2023-06-16
  • bootstrap中Table服务端处理分页的示例分析
    这篇文章主要介绍了bootstrap中Table服务端处理分页的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下要考虑函数...
    99+
    2024-04-02
  • vue中项目结构的示例分析
    这篇文章主要为大家展示了“vue中项目结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中项目结构的示例分析”这篇文章吧。新建一个项目之后,我们...
    99+
    2024-04-02
  • Spring Native项目的示例分析
    小编给大家分享一下Spring Native项目的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!关于Spring NativeSpring官方博客于202...
    99+
    2023-06-15
  • Django中静态文件与模板的示例分析
    这篇文章主要介绍了Django中静态文件与模板的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。模板之前我们的视图函数test使用了HttpResponse返回一个字符...
    99+
    2023-06-29
  • C++中伪共享的示例分析
    这篇文章将为大家详细讲解有关C++中伪共享的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在多核并发编程中,如果将互斥锁的争用比作“性能杀手”的话,那么伪共享则相当于“性能刺客”。“杀手”与“...
    99+
    2023-06-15
  • PHP后期静态绑定的示例分析
    小编给大家分享一下PHP后期静态绑定的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基础知识1. 范围解析操作符 (::...
    99+
    2024-04-02
  • VB.NET局部静态变量的示例分析
    这篇文章将为大家详细讲解有关VB.NET局部静态变量的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB支持用Static关键字声明局部变量,这样在过程结束的时候可以保持变量的数值:Public&...
    99+
    2023-06-17
  • SpringBoot在项目中访问静态资源步骤分析
    在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置 1.在项目的application.yml文件中做如下配置 spring: ...
    99+
    2023-01-28
    SpringBoot访问静态资源 SpringBoot访问资源 SpringBoot资源访问
  • Node爬虫项目的示例分析
    这篇文章主要介绍了Node爬虫项目的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。FirstIntroduction50 lines...
    99+
    2024-04-02
  • node.js项目相关的示例分析
    这篇文章给大家分享的是有关node.js项目相关的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 npm start 启动整个项目2 postman chrome 插件...
    99+
    2024-04-02
  • Docker部署项目的示例分析
    这篇文章主要为大家展示了“Docker部署项目的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Docker部署项目的示例分析”这篇文章吧。环境准备Docker安装启动检查系统内核是否满足...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作