国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

NSFish / 1237人閱讀

摘要:行,判斷如果為空,那么返回默認路由。行,把處理完畢后找到的返回。方法該方法是自動按著約定規則去目錄去找路由的過程。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。

前言

我個人覺得在當前 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(CodeIgniterRouterRouteCollectionInterface $routes = null, $getShared = true)
{
    if ($getShared)
    {
        return self::getSharedInstance("router", $routes);
    }

    if (empty($routes))
    {
        $routes = self::routes(true);
    }

    return new CodeIgniterRouterRouter($routes);
}

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

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

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

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

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

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

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

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

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

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

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

autoRoute 方法

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

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

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

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

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

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

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://specialneedsforspecialkids.com/yun/22938.html

相關文章

  • Codeigniter 4.0-dev 源碼學習筆記之三——核心文件 Codeigniter.ph

    摘要:行,是否強制訪問。行,嘗試處理此次請求,詳細見方法。至此,的執行主流程完畢。小結是的核心文件,它被調用后,完成了諸多的主流程操作。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 Codeigniter.php 是 CI 4 的核心所在,在這里接收并處理了 request 請求,安全檢查,緩存處理, URL 解析以及路由匹配,執行過濾器,加載運行 Controll...

    alighters 評論0 收藏0
  • Codeigniter 4.0-dev 源碼學習筆記之五——相對于 3.x 的變化

    摘要:支持命名空間是沒有支持命名空間的。配置文件不再是簡單數組了新的配置文件是以對象組織的,各個配置以對象的屬性形式暴露出來。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 CI 為了追上大家的腳步,這次跨了一大步,盡量使用了更多的流行設計理念,甚至連 PHP 的支持版本都是從 7 開始起步的。我在之前閱讀源碼的同時也發現了很多變化的地方,在此把已經發現的列舉出來,不...

    Youngdze 評論0 收藏0
  • Codeigniter 4.0-dev 源碼學習筆記之六——控制器

    摘要:控制器嚴格來說,這個是控制器父類的源碼。在中,控制器僅負責接到返回的組裝的頁面字符串,并回核心中,由核心再處理后續事宜。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 前言 其實一開始我是很糾結是否要寫控制器的源碼分析的,因為控制器的源碼太少了,少到你不相信這是一個 MVC 里的一個重頭。直覺里,大家都覺得控制器作為各個請求的入口,其后端應該有很多很多的代碼支撐才可以...

    asce1885 評論0 收藏0
  • Codeigniter 4.0-dev 源碼學習筆記之一——前言以及 CI 4 預覽

    摘要:版權聲明可轉載,但不論任何媒體都需要在轉載前與本人溝通,并在轉載時注明出處。的各個核心模塊以模塊名為目錄名分別存儲在這個目錄下。下一篇文章會涉及到和。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 寫在前面: 為什么選擇開發過程中的 CI 4 作為源碼解讀版本:(1)首先我選 CI 是因為它之前的穩定版都是相對比較輕量小巧的,而且可以認為是簡單的。(2)為什么沒有選...

    MSchumi 評論0 收藏0
  • Codeigniter 4.0-dev 源碼學習筆記之二——入口以及初始化操作

    摘要:通過這個函數可以很方便的在程序運行期間執行很多常見操作。此文可以轉載,但轉載前需要發郵件到進行溝通,未溝通的均視作侵權。 index.php index.php 是整個框架的入口文件,也就是說所有的請求都要從它這里開始。因為 index.php 源碼非常簡潔,那么我們直接放一張源碼截圖,按著截圖說一下源碼。 showImg(https://segmentfault.com/img/re...

    _ivan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<