• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 关于 Laravel 项目 伪静态分页处理

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

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了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);


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2022-04-29解决sqlServer使用ROW_NUMBER时不排序的方法
  • 2022-04-29PS制作超酷黑白像素文字效果
  • 2022-04-29Photoshop绘制金属质感的钢铁侠头像
  • 2022-04-29图文详解Thinkphp5多语言切换(中英文实例)
  • 2022-04-29带你开发一个虎年春节头像生成小程序
  • 2022-04-29四个vue后台常用模板,你知道几个?
  • 2022-04-29vuejs中v-show和v-if的区别是什么
  • 2022-04-29DEDE建站内部SEO优化
  • 2022-04-29Uniapp中怎么使用scrpll-view组件实现下拉刷新
  • 2022-04-29带大家聊聊小程序中的几种页面传参方式

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • DEDECMS注册成功页面加入马上激活链接转向注册邮
    • 织梦DedeCMS系统列表页调用TAG标签并带上链接的实
    • Thinkphp6自定义配置文件以及调用(config文件夹下的配置)
    • 聊聊Bootstrap5中的断点与容器
    • PHP+jQuery+MySql实现红蓝投票功能
    • Photoshop制作2013花纹装饰艺术字
    • php中如何获取当前的函数名
    • PhotoShop打造Wacom中国风熊猫创意广告海报制作教程
    • HTML用JS导出Excel的五种方法
    • Linux环境变量配置的6种方法,建议收藏!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有