Codeigniter 4.0-dev 版源碼學習筆記之四——詳細路由過程

前言

我個人覺得在當前 MVC 流行的架構下,要想去了解一個框架,或者是一個基于此架構下的應用程序,最好的入手方式就是先看路由,雖然路由不是 MVC 里的任何一個,但是知道了路由的來龍去脈就知道了整個框架或者是應用的結構。從一個請求開始,具體分配到哪個 C 去執行的, C 里又調用了哪些東西,整個脈絡也就清晰了。

然而整個路由的實現的邏輯本身又是比較好理解的,無非就是從請求的 URL 中按著約定的規則取出 C 對應的 class 以及 method 即可。如此,我們接下來詳細看看 CI 4 dev 版的路由具體實現的邏輯。

找到路由邏輯的具體位置

上一節我們說 Codeigniter.php 的時候講到, index.php 入口文件通過 $app->run() 調取了 Codeigniter 類中的 run 方法。 run 中又執行了 handleRequest 方法用來處理請求的具體信息。接著 handleRequest 調取 tryToRouteIt 來嘗試解析路由,此時代碼邏輯還在 Codeigniter.php 里,真正的解析過程還沒有開始。在 tryToRouteIt 方法中,通過 service 方式加載了 router 類,通過 system/config/service 加載 router 代碼如下,這也是一個服務加載的統一形式,其它的核心輔助類都是如此加載:

public static function router(\CodeIgniter\Router\RouteCollectionInterface $routes = null, $getShared = true)
{if ($getShared){return self::getSharedInstance('router', $routes);}if (empty($routes)){$routes = self::routes(true);}return new \CodeIgniter\Router\Router($routes);
}

從 倒數第二行可以看出加載的 router 類位于 system/router 下的 Router 類里。

system/router/Router.php 解析路由的詳細過程

首先我們把 Codeigniter.php 中調用該類的詳細代碼列出來如下:

$this->controller = $this->router->handle($path);
$this->method     = $this->router->methodName();

關鍵的只有兩行,一行找類一行找方法。找類的那一行處理了大部分的邏輯,找方法的那一行就是簡單的 get 。

handle 方法源碼截圖

  1. 146-150 行,判斷 $uri 如果為空,那么返回默認路由。因為在該類的構造方法里讀取了配置中的默認路由,因此此處直接返回配置即可。

  2. 153-156 行,檢查路由配置文件里的配置是否有和當前匹配的 URL ,有的話,直接返回配置的控制器即可。

  3. 161-164 行,檢查是否開啟了自動路由匹配,如果沒有開啟,那么讀取完配置好的路由都沒有結果,那么就可以 throw pageNoteFoundException 了。

  4. 166 行,真正的處理 CI 路由邏輯的地方。詳細見 autoRoute 方法。

  5. 168 行,把處理完畢后找到的 controller 返回。

此方法通過調用其它方法已經實現了尋找 controller 的過程,主流程到此已經結束。

autoRoute 方法

該方法是自動按著約定規則去 controller 目錄去找路由的過程。

autoRoute 方法源碼截圖

  1. 442 行:將 URI 按著 / 打散成數組。

  2. 444 行:確定 URI 里是否包含 Controller 的目錄部分。該方法將 $segments 數組由 0 元素一次一次循環并匹配 application/controller 下的目錄,找到后并且該目錄下沒有同名的 PHP 文件即認為是路徑組成部分,同時將該元素從 $segments 中去除,以保證 $segments 中剩下的僅僅是 class 與 method 內容。

  3. 448-456 行:去除路徑后發現 $segments 數組沒元素啦,那么只能是默認處理了。否則直接彈出數組中的第一個元素即是 class 信息。

  4. 461-464 行:如果此時 $segments 中不為空,那么彈出數組中第一個元素是 method 信息。

  5. 466-469 行:如果此時 $segments 中還不為空,那么剩下的就是傳遞的參數信息。

  6. 472-476 行:判斷代表 controller 的文件存在的話 include 進來。

小結

至此,路由部分處理完了,找到的 controller 與 method 信息分別放到了對象對應的屬性里。因此在 codeigniter.php 中用以下兩行就拿到了相應的信息:

$this->controller = $this->router->handle($path);
$this->method     = $this->router->methodName();

下一章應該會看看 CI 4 相對 CI 3 的變化。

此文可以轉載,但轉載前需要發郵件到imustgxd*sina.cn進行溝通,未溝通的均視作侵權。 轉載同時需注明原文鏈接
(https://segmentfault.com/a/11...,并保留此段文字。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282029.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282029.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282029.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

固態硬盤和機械硬盤的比較和SQLSERVER在兩種硬盤上的性能差異

聽說固態硬盤是高富帥的必備神器,本人為了提升工作效率和提高工作速度 這個月節衣縮食,終于也決定買了一塊三星固態硬盤120G容量 這個固態硬盤拿在手里輕飄飄的, 好像里面什么東西都沒有似的 廢話少說,先上圖 開機速度20秒左右 測…

大文件讀寫效率比較

之前做到一個大日志文件(size > 1G)解析的項目,在此記錄下對于大文本解析方式的效率比較。不同方式的性能差別很大,那個項目的日志解析時間能從原來的超過36小時優化到只需要2分鐘,awk功不可沒。 bash 比較 bash腳本…

python裝飾器執行順序

2019獨角獸企業重金招聘Python工程師標準>>> 1、單個裝飾器執行 上來先看代碼: import timedef deco(func):functools.wraps(func)def _wrapper():startTime time.time()print "start"func()print "end"endTime time.time()msecs …

tomcat限制用域名訪問 禁止 ip訪問

有時候會遇到服務器網站。只可以通過域名訪問。而不允許ip訪問。防止域名惡意解析,tomcat可以實現這個簡單功能。1,禁止ip訪問項目 2,只允許綁定域名訪問環境:tomcat7 外網地址:114.113.100.166 域名:bi…

Object關于屬性property的靜態方法

Object.defineProperty Object.defineProperty(obj, prop, { value: undefined, enumerable: true, writable:true, get: function() {return value}, set: function(newValue) {value newValue;} }) 當時配置了set和get時,則不能配置value。 Object.getOwnPropert…

99. Recover Binary Search Tree

一、題目 1、審題 2、分析 給出一個二叉查找樹,其中有兩個元素的位置弄錯了,寫算法將其恢復。 二、解答 1、思路: 方法一、 通過中序遍歷可以確定一棵二叉查找樹由小到大的順序。 所以在此錯位的查找樹中查找到的節點中有 1 個比后續節點值大…

myeclipse+git pull項目報錯

2019獨角獸企業重金招聘Python工程師標準>>> 1.在本地工程目錄(.git)找到config文件; 2.修改config文件內容為: [core] repositoryformatversion 0 filemode false logallrefupdates true [branch "master"] remote origin m…

luoguP4755 Beautiful Pair

https://www.luogu.org/problemnew/show/P4755 考慮分治,在 [l, r] 區間中用線段樹找到最大的一個點,處理經過它的可行數對的個數,統計個數可以離線樹狀數組處理 因為最多被分成 2n 個區間(像線段樹一樣),對…

如何關掉macbook的開機聲音

1、系統偏好設置->聲音 2、關掉“啟動時播放聲音” 這樣設置之后,macbook再開機就沒有“咚”的那個聲音了

oatdata結構詳解

段名稱 文件內偏移段大小ELF頭部0x000000000x00001000oatdata0x000010000x027b8000oatexec0x027b90000x01ed69ecELF尾部0x046900000x00001000OatHeader: 0x00001000 | 6F 61 74 0A 30 33 39 00 77 40 00 B1 03 00 00 00 | 0x00001010 | 01 00 00 00 19 00 00 00 00…

【躍遷之路】【599天】程序員高效學習方法論探索系列(實驗階段356-2018.09.27)...

(躍遷之路)專欄 實驗說明 從2017.10.6起,開啟這個系列,目標只有一個:探索新的學習方法,實現躍遷式成長實驗期2年(2017.10.06 - 2019.10.06)我將以自己為實驗對象。我將開源我的學習方法,方法不斷…

開源 java CMS - FreeCMS2.6 Web頁面信息采集

2019獨角獸企業重金招聘Python工程師標準>>> java開源論壇系統http://javabbs.javaz.cn 項目地址:http://www.freeteam.cn/ Web頁面信息采集 從FreeCMS 2.1開始支持 通過簡單配置即可抓取目標網頁信息,支持增量式采集、關鍵字替換、定時采集&…

PropertySource和ConfigurationProperties

https://blog.csdn.net/u013725455/article/details/79352459轉載于:https://www.cnblogs.com/qunincey/p/9721364.html

ORACLE關于段的HEADER_BLOCK的一點淺析

在學習段(segment)、區間(extent)時,對段的HEADER_BLOCK有一些疑問,本文記錄一下探究的實驗過程以及相關總結,,如有不對的地方,敬請指出。以SCOTT.EMP表為例(…

【源碼探索】.NET中的List,為什么即有Count屬性又有Count()方法

“優秀的程序員的標準之一是&#xff1a;編寫更易于擴展的代碼”圖片&#xff1a;奧森公園的向日葵 拍攝于2022年7月23日01—問題緣起上一篇中&#xff0c;我們知道List<T>的是基于數組實現的可變長度的列表。很多小伙伴發現&#xff0c;List<T>即有Count屬性又有C…

使用ASP.NET廣告控件的XML語言創建廣告鏈接--ASP.NET

1、AdRotator廣告控件的所有屬性都是可選的&#xff0c;XML文件中可以包含如下表所示的屬性&#xff08;XML文件的廣告屬性&#xff09;。 屬性 說明 ImageUrl 要顯示的圖像的URL NavigateUrl 單擊AdRotator控件時要轉到的網頁URL AlternateText 圖像不可用時現實的問…

vim編輯和命令模式、實踐

2019獨角獸企業重金招聘Python工程師標準>>> 9月29日任務 5.5 進入編輯模式 5.6 vim命令模式 5.7 vim實踐 Vim編輯模式 進入編輯模式 操作 說明 i 在光標所在字符前插入內容 I 在光標所在行行首插入內容 a 在光標所在字符后插入內容 A 在光標所在行行尾插入…

英語自動提取高頻詞_斑馬英語提分營免費體驗課

斑馬英語電腦版是一款專業可靠的英語學習軟件&#xff0c;斑馬英語官方版可以幫助孩子學習純正的英語口語發音&#xff0c;以講故事的形式讓孩子學習單詞及口語練習&#xff0c;斑馬英語電腦版針對兒童語言特征設計的智能口語測評系統&#xff0c;能夠自動識別發音和評分&#…

【C# Personal Handbook】開篇

博客已提更一年多了&#xff0c;這段時間里&#xff0c;發生了很多事情&#xff0c;也讓我對C#更加依戀&#xff0c;所以我決定重新更新博客&#xff0c;以自己的實踐經驗梳理C#的技術脈絡&#xff0c;也歡迎大家手下留情&#xff0c;耐心指點&#xff0c;讓我們共同進步吧&…

canvas特效代碼詳解(2)

canvas是一個就基于像素的畫圖h5元素。 利用canvas做一個如下描述所示的動態圖形&#xff1a;當鼠標點下去時開始繪圖&#xff0c;在鼠標結束時完成一個矩形&#xff0c;當再一次點擊時重復第一次的繪圖步驟。 1 <!DOCTYPE html>2 <html>3 <head>4 …