Codeigniter 4.0-dev 版源碼學習筆記之六——控制器

前言

其實一開始我是很糾結是否要寫控制器的源碼分析的,由於控制器的源碼太少了,少到你不相信這是一個 MVC 裏的一個重頭。直覺裏,你們都以爲控制器做爲各個請求的「入口」,其後端應該有不少不少的代碼支撐才能夠的,然而事實相反,去掉註釋後,一共才 60 行左右。php

控制器以前

看控制器源碼以前,咱們仍是要回顧一下,控制器是怎麼來的。後端

Controller 建立源碼截圖

請你們看截圖,截圖中有兩個方法:分別是 createController 和 runController。緩存

createController 負責把路由找到的 controller 類實例化。實例化時,能夠看到 request 和 response 做爲參數傳遞給了 controller 的構造方法,這也是爲何在定義 controller 時,若是定義了 __construct 方法必定要記得調用一下 parent::__construct() ,由於默認定義了 __construct 方法後會覆蓋了父類的 __construct ,因此必須明確調用父類構造方法才能執行。codeigniter

runController 是執行控制器過程,大體思路就是把剛剛實例話的對象拿過來,執行路由中找到的控制器方法。而且把輸出返回。源碼分析

控制器

控制器源碼截圖

嚴格來講,這個是控制器父類的源碼。爲控制器運行期間定義了一些經常使用的方法,如 post 參數驗證,緩存等。下面具體說一下:post

  1. 11-16 行:控制器父類的屬性,這些屬性能夠定義控制器自己的狀態。能夠在本身定義的類中覆蓋掉這些屬性。 helpers 定義要加載的輔助方法,forceHTTPS 大於 0 時,能夠指定當前設定值期間內強制到 https 。 validator 定義要驗證的 post 內容的規則。ui

  2. 18-29 行:控制器父類的構造方法,在定義控制器時若是沒定義本身的構造方法,這個方法會被默認執行,若是定義過將會覆蓋掉這個方法,須要在構造方法的最前邊執行 parent::__construct() 以保證這個方法中的初始化數據都能正常初始化。其中 forceHTTPS 方法是強制使用 https 協議,loadHelpers 能夠默認自動加載須要的 helper 。this

  3. 51-60 行: validate 方法,主要輔助驗證 post 請求過來的各個字段。形式以下:spa

if (! $this->validate($this->request, [
        'email' => "required|is_unique[users.email,id,{$userID}]",
        'name' => 'required|alpha_numeric_spaces'
    ]))
    {
        return view('users/update', [
            'errors' => $this->errors
        ]);
    }

    // do something here if successful...

以上源碼截取自 CI 4 官方手冊。若是以爲驗證規則那個比較亂的話,能夠在 ConfigValidation.php 中自定義一個驗證組,並用如下方式驗證:3d

$this->validate($this->request, 'userRules')

控制器以後

咱們都知道,控制器會和 view 端交互,在以前的 CI 版本中,控制器會把 view load 進本身的生命週期中,直接處理 request 信息。我的也以爲這有些把 controller 的地位看得過重了。在 CI 4 中,控制器僅負責接到 view 返回的組裝的頁面字符串,並 return 回 codeigniter 核心中,由核心再處理後續事宜。

結語

本節簡單的說了說控制器的父類,源碼比較少,說的也就很少。下一節試着說說 view 。

此文能夠轉載,但轉載前須要發郵件到imustgxd*sina.cn進行溝通,未溝通的均視做侵權。 轉載同時需註明連接,並保留此段文字。

相關文章
相關標籤/搜索