codeigniter路由實現原理

weixin_34116110發表於2015-04-27

CI 的工作流程圖

載入檔案順序

  • 使用者輸入:http://stblog.loc/index.php/feed/12
  • 首先載入入口檔案:index.php
    • 定義使用環境(ENVIRONMENT),框架路徑(system_path,BASEPATH),應用目錄(application_folder),應用路徑(APPPATH)等,載入(require)CI核心檔案。
    • 載入 BASEPATH/core/CodeIgniter.php ,系統初始化檔案,整個框架最 核心的部分,在此載入(load)了一系列的base class。
      • 載入 BASEPATH/core/Common.php ,common檔案包含一系列的基礎和公共函式 ,供全域性使用,例如load_class(),get_config()等 。
      • 載入 BASEPATH/core/Benchmark.php, 這是一個基準測試類,預設標註了應用各個階段的執行點,以得到其執行時間。也允許你自己定義監測點。
      • 載入 BASEPATH/core/Hooks.php CI_Hooks是一個鉤子類,是框架進行擴充套件的核心,能夠在程式允許的各個階段插入掛鉤點,執行你自定義的類,函式等
      • 載入 BASEPATH/core/Config.php 配置檔案。
      • 載入 BASEPATH/core/URI.php URI類幫助你解析請求的uri,並提供分割uri的函式集合,供Router類使用
      • 載入 BASEPATH/core/Router.php , 路由類,即通過請求的uri,和使用者配置的路由(APPPATH/config/routes.php),將使用者請求分發到指定的Controller例項中某一action函式中。
      • 載入 BASEPATH/core/Output.php, BASEPATH/core/Input.php , 輸入類,即處理請求的輸入引數,提供安全的獲取方式。輸出類將最後的執行結果傳送出去,它還負責快取的功能。
      • 載入 BASEPATH/core/Controller.php 控制器基類,用 單例模式對外提供例項,整個應用程式的心臟。它是一個Super Object,在應用內載入的類都可以成為控制器的成員變數,這一點非常重要。
      • APPPATH/controllers/$RTR->fetch_directory().$RTR->fetch_class().'.php',通過路由功能,得到控制器名,例項化真正的控制器類(子類)
      • call_user_func_array 呼叫處理函式,通過路由,得到action函式名,呼叫 Controller->action()函式,處理應用邏輯,實際業務處理邏輯便是在action函式中寫的
      • $OUT->_display() 將內容輸出。

以上步驟中在 BASEPATH/core/CodeIgniter.php 中的

$RTR =& load_class('Router', 'core');
$RTR->_set_routing();
  • 首先載入Router類然後呼叫其中的_set_routing()方法。
  • 在該方法中首先把使用者在config目錄中設定的
    route.php的$route路由陣列取出來。
  • 通過$route中配置的路由規則,使用 _parse_routes() 方法拆分出$this->uri->segments中的控制器,方法,引數,將真正需要訪問
    的類和方法存入$this->class,和$this->method。
  • 最後在CodeIgniter.php中
$class  = $RTR->fetch_class();
$method = $RTR->fetch_method();
$CI = new $class();
  • 這兩個方法就是從Router類中已過了一系列url過濾,路由規則獲取的$this->class,$this->method。
  • 然後初始化這個$class,就實現了從一個帶有路由規則的URL到進入框架的一系列具體實現過程。

相關文章