如何實現一個php框架系列文章【4】url路由管理

来源:http://www.cnblogs.com/yyluming/archive/2016/02/16/5192156.html
-Advertisement-
Play Games

直接通過url參數訪問業務模塊($app)中控制器($ctl)里的函數($act) 我們支持3種路由模式 普通模式 _a=$app, _u=$ctl.$act 最簡單的方式,專註實現業務$act函數,不需要再寫額外代碼 為什麼參數名前面要加下劃線就不解釋了 easy模式 _easy=$app.$tp


直接通過url參數訪問業務模塊($app)中控制器($ctl)里的函數($act)

 

我們支持3種路由模式

    普通模式  

        _a=$app,     _u=$ctl.$act        

        最簡單的方式,專註實現業務$act函數,不需要再寫額外代碼

        為什麼參數名前面要加下劃線就不解釋了

          

 

    easy模式

        _easy=$app.$tpl.$ctl.$act

        _easy=$app.$ctl.$act

        在web開發中,通常我們在$act中輸出一個前端頁面,

        easy模式下,如果未實現$act處理函數,會自動尋找並顯示對應的前端模板文件。

        對於簡單的展示頁面適合使用這種路由模式

        

        

   url重寫模式(需要nginx或apache配置)         

        apache: ^rewrite[\.\/](.*)$ /index.php?_rewrite=$1  [R,QSA]

        nginx:  rewrite ^/rewrite[\.\/](.*)$ /index.php?_rewrite=$1 last;

 

        rewrite.{$app}.{$ctl}.{$act}.{$params}.html

        或更加優雅的目錄式訪問方式

        rewrite/{$app}/{$ctl}/{$act}/{$params}.html

 

        其中$params為選填參數部分.格式為urlencode後的參數列表    

        如果想傳遞sp_uid=1&d=1.2&p=sb, 那麼$params = sp_uid%3D1%26d%3D1.2%26p%3Ds%2Fb

        或sp_uid/1/d/1.2/p/sb 

       

         在某些要求url中不能帶?&特殊字元的場景下可以使用這種模式

        1. 為了能通過qq oauth2登陸驗證,需要配置重寫規則

            rewrite.thirdlogin.index.qqcallback.sp_uid%3D1.php

        2. 資源靜態化

            rewrite.upload.index.out.uidm%3D310ef4b.png

        3. 支付回調

            rewrite.pay.weixin.native2_notify.php

        4. 微信開放平臺授權回調

            rewrite/web/component/message/_app_id/xxxxxxx.php

 

 

 

 

部分實現代碼

1 2 3 4 5 6 7 8 9 10 11 12 13     $a = (!empty($_REQUEST['_a']) && is_string($_REQUEST['_a'])) ? $_REQUEST['_a'] : 'web';     if (!preg_match('/^[\w\.]+$/'$a)) {         exit('invalid _app name! ' . htmlspecialchars($a));     }        $GLOBALS['_UCT']['APP'] = !empty($a) ? strtolower($a) : 'web';              $u = (!empty($_REQUEST['_u']) && is_string($_REQUEST['_u'])) ? $_REQUEST['_u'] : 'index.index';     if (!preg_match('/^[\w\.]+$/'$u)) {         exit('invalid _url name! ' . htmlspecialchars($u));     }        $u                      explode('.'$u, 2);      $GLOBALS['_UCT']['CTL'] = !empty($u['0']) ? strtolower($u['0']) : 'index';     $GLOBALS['_UCT']['ACT'] = !empty($u['1']) ? strtolower($u['1']) : 'index';

 

easy模式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26     //easy 模式直接訪問模板tpl     if (!empty($_REQUEST['_easy']) && is_string($_REQUEST['_easy'])) {         $easy explode('.'$_REQUEST['_easy']);         switch (count($easy)) {             case 4:                 $_GET['_u'] = $_REQUEST['_u'] = $easy[2] . '.' $easy[3];                 if (preg_match('/^[\w\.]+$/'$easy[1])) {                     $GLOBALS['_UCT']['TPL'] = $easy[1];                 }                 $_GET['_a'] = $_REQUEST['_a'] = $easy[0];                 break;             case 3:                 $_GET['_u'] = $_REQUEST['_u'] = $easy[1] . '.' $easy[2];                 $_GET['_a'] = $_REQUEST['_a'] = $easy[0];                 break;             case 2:                 $_GET['_u'] = $_REQUEST['_u'] = $easy[1];                 $_GET['_a'] = $_REQUEST['_a'] = $easy[0];                 break;             case 1:                 $_GET['_a'] = $_REQUEST['_a'] = $easy[0];                 break;             default:                 exit('invalid _easy param! ' . htmlspecialchars($_REQUEST['_easy']));         }     }

 

rewrite模式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51     //url重寫模式     if (!empty($_REQUEST['_rewrite']) && is_string($_REQUEST['_rewrite'])) {         //1.支持apache 重寫模式下?後的參數缺失的情況          if(stripos($_SERVER['SERVER_SOFTWARE'], 'nginx') === false) {             $_REQUEST['_rewrite'] = urldecode(substr($_SERVER['QUERY_STRING'], strlen('_rewrite=')));         }         //2. 丟棄_rewrite中的尾碼名         $rewrite substr($_REQUEST['_rewrite'], 0, strrpos($_REQUEST['_rewrite'], '.'));           //3. 支持/作為分隔符         $sp '.';         for($i = 0; $i strlen($rewrite); $i++) {             if(in_array($rewrite[$i], array('.''/'))) {                 $sp $rewrite[$i];                 break;             }         }         $rewrite explode($sp$rewrite, 4);         //最後1段是必填尾碼名         switch(count($rewrite)) {             case 3:             case 4: {                 $_GET['_a'] = $_REQUEST['_a'] = $rewrite[0];                 $_GET['_u'] = $_REQUEST['_u'] = $rewrite[1].'.'.$rewrite[2];                 if(!empty($rewrite[3])) {                     if(strpos($rewrite[3], '/')) {                         $params explode('/'$rewrite[3]);                         for($i=0; $i+1<count($params); $i+=2) {                             $_REQUEST[urldecode($params[$i])] = urldecode($params[$i+1]);                         }                        }                        else {                         foreach(explode('&'$rewrite[3]) as $p) {                             list($k$v) = explode('='$p, 2);                               $_REQUEST[urldecode($k)] = urldecode($v);                         }                        }                    }                    break;             }                case 2:                 $_GET['_a'] = $_REQUEST['_a'] = $rewrite[0];                 $_GET['_u'] = $_REQUEST['_u'] = $rewrite[1];                 break;             case 1:                  $_GET['_a'] = $_REQUEST['_a'] = $rewrite[0];                 break;             default:                 break;         }          }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是CocoaPods CocoaPods是iOS項目的依賴管理工具,該項目源碼在Github上管理。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得我們可以節省設置和第三方開源庫的時間。 在使用CocoaPods之前,開發項目需要用到第三方開源庫的時候,我們需要 1...
  • 問題沒有解決,屬於菜鳥級別的孩子~~~~ 求助啊,求助!!!!!! 報告如下: Warning:An unhandled exception occurred. Please report the problemusing the error reporting dialog or via emai
  • php的函數包括用戶定義的函數、內部函數(print_r count...)、匿名函數、變數函數($func = 'print_r'; $func(array('a','b'));) PHP內核源碼中將函數分為以下類型 #define ZEND_INTERNAL_FUNCTION 1 #define
  • 大型網站的優化技術:1,SEO,優化一種,2,頁面靜態化3,memcache(記憶體緩存)4,伺服器集群技術 總的目標:提高網站的訪問速度,SEO目的:提高網站的排名,(解決的是速度)SEO: google 的優化,百度的優化: 今天先從頁面靜態化來講:先講幾個概念:1,靜態網址純粹的html文檔ht
  • 一.BeanFactory BeanFactory是Spring IOC容器的鼻祖,是IOC容器的基礎介面,所有的容器都是從它這裡繼承實現而來。可見其地位。BeanFactory提供了最基本的IOC容器的功能,即所有的容器至少需要實現的標準。 BeanFactory體繫結構是典型的工廠方法模式,即什
  • 由於項目開發進程中有一些重覆性的代碼進行編寫,沒有任何業務邏輯,粘貼複製又很麻煩且容易出錯,故想起做一個eclipse插件來滿足一下自己的工作需要,同時記錄一下,以供以後參考與共同學習。本文主要講解一步一步開發eclipse插件的過程,沒有對每一步進行詳細的講解,如需查看詳細介紹請自行百度、Goog...
  • 假設ModelA和ModelB之間是BelongsTo的關係 如果同屬於一個資料庫連接 那麼 public function a(){ return $this->belongsTo("ModelA") } 如果兩個模型屬於不同的資料庫 那麼 public function a() { $insta
  • 1、安裝和配置 參考 http://symfony.cn/docs/book/installation.html 使用安裝工具: windows系統 Open your command console and execute the following command: c:\> php -r "r
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...