手上有Laravel 的項目,要求做偽靜態處理,項目中使用了Laravel 自帶的分頁組件,分頁組件分頁會在你的URL 用Query 的方式做頁碼的傳遞,達不到偽靜態的要求。
想要的效果對應Laravel 的路由是:我們偽靜態想要的效果大體是這樣的:
/software/3dmax/created_at/page-1.html
/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
方法會呼叫
- 下的
- paginator
方法。
paginator
方法會建構一個
Illuminate\Pagination\LengthAwarePaginator 的實例。 -
Illuminate\Pagination\LengthAwarePaginator
會使用
Illuminate\Pagination\AbstractPaginator 中的 - url
方法進行建構請求參數和url。
現在我們找到產生 URL 的地方了,我們需要做的就是在這裡修改。
重寫分頁元件
mkdir app/Pagination
touch app/Pagination/LengthAwarePaginator.php
檔案app/Pagination/LengthAwarePaginator.php 內容:
<?php namespace 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 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(); } ...
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中文網其他相關文章!

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于单点登录的相关问题,单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于Laravel的生命周期相关问题,Laravel 的生命周期从public\index.php开始,从public\index.php结束,希望对大家有帮助。

在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。

laravel中asset()方法的用法:1、用于引入静态文件,语法为“src="{{asset(‘需要引入的文件路径’)}}"”;2、用于给当前请求的scheme前端资源生成一个url,语法为“$url = asset('前端资源')”。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于使用中间件记录用户请求日志的相关问题,包括了创建中间件、注册中间件、记录用户访问等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于中间件的相关问题,包括了什么是中间件、自定义中间件等等,中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制,下面一起来看一下,希望对大家有帮助。

在laravel中,fill方法是一个给Eloquent实例赋值属性的方法,该方法可以理解为用于过滤前端传输过来的与模型中对应的多余字段;当调用该方法时,会先去检测当前Model的状态,根据fillable数组的设置,Model会处于不同的状态。

laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版