首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

修正 ThinkPHP U 函數支援路由模式下分頁連結生成

     編輯:PHP 相關知識

問題背景

ThinkPHP 3.1/3.2 開啟 URL 路由後,分頁類生成的連結為原始參數模式(/page/2),而非路由規則定義的偽靜態格式(/list-2.html),導致分頁連結失效。

根因分析

分頁類內部呼叫 U() 函數組裝 URL,但 U() 未處理路由規則反向解析,直接拼接參數。

修正方案:重寫 U() 函數

編輯 ThinkPHP/Common/functions.php,找到 U() 函數(約第 287 行),在參數組裝邏輯後加入路由反向解析:

function U($url = '', $vars = '', $suffix = true, $domain = false) {
    // ... 原有程式碼 ...
    
    if (!empty($vars)) {
        foreach ($vars as $var => $val) {
            if ('' !== trim($val)) {
                $url .= $depr . $var . $depr . urlencode($val);
            }
        }
    }
    
    // ========== 新增:路由反向解析 ==========
    if (C('URL_ROUTER_ON')) {
        $routeRules = C('URL_ROUTE_RULES');
        if (!empty($routeRules)) {
            $currentUrl = '/' . GROUP_NAME . $url;
            
            foreach ($routeRules as $pattern => $rule) {
                // 檢查當前 URL 是否符合路由規則
                if (strpos($currentUrl, $rule) !== false) {
                    // 提取規則中的動態參數
                    if (preg_match('/\/:(\w+)/', $pattern, $matches)) {
                        $paramName = $matches[1];
                        // 替換為路由模式
                        if (C('APP_SUB_DOMAIN_DEPLOY')) {
                            $url = str_replace($rule, $pattern, '/' . GROUP_NAME . $url);
                        } else {
                            $url = str_replace($rule, $pattern, $url);
                        }
                        // 移除參數部分(已包含在路由模式中)
                        $url = preg_replace('/' . $paramName . '\/[^\/]+/', '', $url);
                    } else {
                        // 靜態路由規則
                        if (C('APP_SUB_DOMAIN_DEPLOY')) {
                            $url = str_replace($rule, $pattern, '/' . GROUP_NAME . $url);
                        } else {
                            $url = str_replace($rule, $pattern, $url);
                        }
                    }
                    break;  // 只匹配第一條符合規則
                }
            }
        }
    }
    // ========== 結束新增 ==========
    
    return $url;
}

路由配置範例

// config/route.php
return [
    'URL_ROUTER_ON' => true,
    'URL_ROUTE_RULES' => [
        'article/:id'     => 'Article/read',
        'list/:page'      => 'Index/list',
        'category/:name'  => 'Category/index',
    ],
];

分頁類配合調整

確保分頁類傳遞參數格式與路由規則一致:

$page = new \Think\Page($count, $listRows);
$page->parameter = 'category=php';  // 傳遞額外參數
$page->setConfig('next', '下一頁');
$page->setConfig('prev', '上一頁');
$page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
echo $page->show();

驗證測試

路由規則修正前 URL修正後 URL
list/:page/Index/list/page/2/list-2.html
article/:id/Article/read/id/123/article-123.html
category/:name/Category/index/name/php/category-php.html

注意事項

  1. 修改核心檔案會影響升級,建議複製 functions.php 至 Common/functions.php 覆蓋
  2. 路由規則優先順序影響匹配,建議具體規則前置
  3. 多語言、多模組場景需擴充匹配邏輯
  4. ThinkPHP 5.0+ 內建支援路由反向解析,無需此修正

進階:自訂分頁 URL 生成

class CustomPage extends \Think\Page
{
    public function show() {
        $url = U($this->url, array_merge($this->parameter, ['page' => '__PAGE__']));
        // 替換 __PAGE__ 佔位符...
        return parent::show();
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved