# Codeigniter 3 架構 :::success :bookmark: 書籤 [TOC] ::: --- ## 基本運作流程圖 ![](https://i.imgur.com/WAnXLQK.png) 1. index.php 檔案是最一開始的 controller,初始化 Codeigniter 基礎資源。 2. Router 解釋 HTTP 請求 去找到這個請求該往哪裡走。 3. 如果 cache 檔案存在,將會直接通過一般系統執行回傳給瀏覽器資料。 4. Security。在傳給 application controller 讀取之前,HTTP 請求以及所有使用者送出的資料會通過它來過濾。 5. Controller 載入 model、core libraries、helpers、以及程式需要的所有特殊資源。 6. 最後 View 是最終的呈現結果,來送回給瀏覽器。如果快取是啟動的,view 會在第一次快取一份,之後使用者在發 HTTP 請求的時候,就會直接回傳這份快取,不需要再通過 Router 了。 --- ## Codeigniter 底層做了什麼事? 1. 載入框架常量、libraries、初始化框架 2. 載入核心的class (Hook, Config, UTF8, URL, Route, Output...) 3. route 判斷與設定 4. 安全檢查 5. 解析request, 使用call_user_func_array調用請求的方法 但調用只是放在緩存裡 6. 檢查_remap 他類似於.htaccess規則(簡單來說就是CI自己的路由規則) 7. 放在緩存裡的最後透過Output輸出 --- ## index.php ::: info 一個常量一旦被定義,就不能再改變或者取消定義。 常量只能包含標量資料(boolean,integer,float 和 string) ::: 1. 大量定義路徑的常量 ![](https://i.imgur.com/WoU02i0.png) 2. 載入框架底層入口 ![](https://i.imgur.com/MDPmfhZ.png) ### 如何實現除了index.php 其他目錄不可存取 1. 首先在根目錄寫入存取規則.htaccess ![](https://i.imgur.com/nO8S7xl.png) 2. 在index.php時候定義常量 BASEPATH ![](https://i.imgur.com/ipjoMgR.png) 3. 例如:Controllers 在最上方的程式碼作用 檢查常量,若沒有表示不是從index開始訪問的,阻止運行 除了index.php之外幾乎所有的檔案都有下圖程式碼 ![](https://i.imgur.com/l3rkPOb.png) --- ## 核心類別(Codigniter.php) ![](https://i.imgur.com/7o4s40G.png) > 圖片引用至 https://blog.csdn.net/ohmygirl/article/details/40788851 ### **(Common)** 載入整個CI框架會用到的一些全域函式。 https://www.cnblogs.com/ohmygirl/p/CIRead-3.html ### **(BM)** BenchMark 用於測試和計算效能、紀錄使用記憶體用量的核心功能 ![](https://i.imgur.com/cnMELcr.png) ### **(EXT)** Hooks #### CodeIgniter提供了7個hooks插入點 >(一) pre_system 在系統執行的初期執行。這時只有benchmark及hook類別被載入。路由或其他程序都還沒執行。 >(二) pre_controller 在所有的控制器(controller)呼叫之前執行。此時所有的基礎類別、路由、安全檢查都已經完成。 >(三) post_controller_constructor 在控制器(controller)實體化之後但是任何方法都還未呼叫之前立刻執行。 >(四) post_controller 在控制器(controller)執行完畢之後立刻執行。 >(五) display_override 覆蓋用來在系統執行完畢後向瀏覽器送出完成的頁面的 _display() 函數。這樣就允許你用你自己定義的顯示方法。注意,你必須用 $this->CI =& get_instance() 取得CI參考物件然後才可透過呼叫 $this->CI->output->get_output() 來使用完成的頁面資料。 >(六) cache_override 讓你可以呼叫自己定義的函數而非output類別中的 _display_cache() 函數。這讓你可以使用自己的cache顯示機制。 >(七) post_system 在完成的頁面送到瀏覽器之後呼叫。在系統執行結束時,完成的資料已送到瀏覽器之後執行。 #### 什麼意思呢? #### 意思是說你可以對一開始介紹的基本運作流程圖的某個流程前後做某件事情 #### 例如在"pre_system"加入自己寫的Middleware來判斷是否有Session >Codeigniter Hooks說明文件 https://codeigniter.org.tw/user_guide/general/hooks.html >使用範例 https://hackmd.io/Y79hilNYRL6TGXfDMNvUzg ### **(CFG)** Config Config設定管理,用來載入設定檔案和設定參數 ### **(UNI)** UTF-8 提供使用UTF-8編碼的支援 ### **(URL)** Uniform Resource Locator 解析URL,透過class中的_set_uri_string來分割URL並儲存給Route調用 ### **(RTR)Route** 透過class中的_set_routing()的方法,可以獲得requset的Controllers、URL分割的參數 被Codeigniter不合法的請求有 1. request 找不到 class 2. 不能訪問 _ 私有方法,因為php並不是一開始就有private或public的權限判斷 3. 請求底層CI方法:method_exists('CI_Controller', $method) 4. request找不到class底下的方法 ### **(SEC)** Security 主要負責的功能有CSRF、過濾惡意字元(xss_clean) ### **(OUT)** Output 主要檢查有沒有cache,有的話回傳cache內容,沒有的話就吐出在記憶體的最後內容 在controllers中常用的$this->load->view('yourview'); 其實只有放在緩存中,最後會透過OUT class來輸出到瀏覽器上 ![](https://i.imgur.com/Gio2HaO.png) > 圖片引用至 https://blog.csdn.net/Zhihua_W/article/details/52821598 ## 延伸閱讀 > 重新認識MVC http://blog.turn.tw/?p=1539 > Model減重方法 http://slides.com/howtomakeaturn/model > Composer http://blog.turn.tw/?p=1039 > 從實際例子學習設計模式 http://slides.com/jaceju/design-patterns-by-examples?fbclid=IwAR04RVkIl7cQZTLpLVvz_TfGz7ZQO-_t9gyPd01BCQK8DrEfBgtHWl6ZdbU#/2 > 你必須資料庫事務隔離級別 https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/656442/