搜尋
首頁php框架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 內容:

<?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();
    }

    ...
  • 使用自訂的分頁元件
  • 在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中文網其他相關文章!

    陳述
    本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
    laravel单点登录方法详解laravel单点登录方法详解Jun 15, 2022 am 11:45 AM

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

    一起来聊聊Laravel的生命周期一起来聊聊Laravel的生命周期Apr 25, 2022 pm 12:04 PM

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

    laravel中guard是什么laravel中guard是什么Jun 02, 2022 pm 05:54 PM

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

    laravel中asset()方法怎么用laravel中asset()方法怎么用Jun 02, 2022 pm 04:55 PM

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

    实例详解laravel使用中间件记录用户请求日志实例详解laravel使用中间件记录用户请求日志Apr 26, 2022 am 11:53 AM

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

    laravel中间件基础详解laravel中间件基础详解May 18, 2022 am 11:46 AM

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

    laravel的fill方法怎么用laravel的fill方法怎么用Jun 06, 2022 pm 03:33 PM

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

    laravel路由文件在哪个目录里laravel路由文件在哪个目录里Apr 28, 2022 pm 01:07 PM

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

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    2 週前By尊渡假赌尊渡假赌尊渡假赌
    倉庫:如何復興隊友
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island冒險:如何獲得巨型種子
    4 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    Safe Exam Browser

    Safe Exam Browser

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

    DVWA

    DVWA

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

    SublimeText3 英文版

    SublimeText3 英文版

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

    EditPlus 中文破解版

    EditPlus 中文破解版

    體積小,語法高亮,不支援程式碼提示功能

    SublimeText3 Linux新版

    SublimeText3 Linux新版

    SublimeText3 Linux最新版