关于 Laravel 项目 伪静态分页处理
发布时间 - 2021-02-20 00:00:00 点击率:次下面由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/Pagination touch app/Pagination/LengthAwarePaginator.php
文件 app/Pagination/LengthAwarePaginator.php 内容:
重写 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);
# laravel
# php
# 继承
# 作用域
# this
# database
# 分页
# 自带
# 自定义
# 重写
# 我们可以
# 绑定
# 的是
# 都是
# 法会
# 在这里
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
轻松掌握MySQL函数中的last_insert_id()
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何批量查询域名的建站时间记录?
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
高端建站三要素:定制模板、企业官网与响应式设计优化
如何在建站之星网店版论坛获取技术支持?
使用Dockerfile构建java web环境
昵图网官方站入口 昵图网素材图库官网入口
如何在服务器上三步完成建站并提升流量?
如何利用DOS批处理实现定时关机操作详解
Laravel如何集成Inertia.js与Vue/React?(安装配置)
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel如何实现API速率限制?(Rate Limiting教程)
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Python3.6正式版新特性预览
如何彻底删除建站之星生成的Banner?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何在阿里云香港服务器快速搭建网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
如何确认建站备案号应放置的具体位置?
如何在云主机上快速搭建网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
Android GridView 滑动条设置一直显示状态(推荐)
高防服务器租用如何选择配置与防御等级?
北京企业网站设计制作公司,北京铁路集团官方网站?
大连 网站制作,大连天途有线官网?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
制作电商网页,电商供应链怎么做?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
如何在阿里云虚拟主机上快速搭建个人网站?
Python面向对象测试方法_mock解析【教程】
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
香港服务器租用每月最低只需15元?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何用免费手机建站系统零基础打造专业网站?
如何快速搭建支持数据库操作的智能建站平台?
高端企业智能建站程序:SEO优化与响应式模板定制开发
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】

