thinkphp5原始碼解析 2 控制器

2022-01-20 02:21:19 字數 2069 閱讀 3713

入口檔案index.php:

// 定義應用目錄

// 載入框架引導檔案

require __dir__ . '/../thinkphp/start.php';

引導檔案start.php:

namespace think;

// 載入基礎檔案

require __dir__ . '/base.php';

// 執行應用

基礎檔案base.php:

defined('think_path') or define('think_path', __dir__ . ds);

define('lib_path', think_path . 'library' . ds);

define('core_path', lib_path . 'think' . ds);

// 此處省略一堆的define...

// 載入loader類

require core_path . 'loader.php';

// 註冊自動載入

\think\loader::register();

public static function run(request $request = null)

elseif (!is_null($data)) else

return $response;

}

routecheck拿到$_server['path_info']獲取控制器和操作名,返回格式:

array(2) 

}

exec()呼叫module()通過反射來例項化控制器和執行操作:

protected static function exec($dispatch, $config)

/** * 執行模組

* @access public

* @param array $result 模組/控制器/操作

* @param array $config 配置引數

* @param bool $convert 是否自動轉換控制器和操作名

* @return mixed

*/public static function module($result, $config)

/** * 呼叫反射執行類的例項化 支援依賴注入

* @access public

* @param string $class 類名

* @param array $vars 變數

* @return mixed

*/public static function invokeclass($class, $vars = )

else

return $reflect->newinstanceargs($args);

}/**

* 呼叫反射執行類的方法 支援引數繫結

* @access public

* @param string|array $method 方法

* @param array $vars 變數

* @return mixed

*/public static function invokemethod($method, $vars = )

else

$args = self::bindparams($reflect, $vars);

return $reflect->invokeargs(isset($class) ? $class : null, $args);

}

最終run()獲得response物件,呼叫response->send()方法輸出資料

結論$_server['path_info']獲得模組/控制器/操作,通過反射例項化控制器並執行操作

疑問為什麼沒有直接用autoload來排程控制器呢?

缺點不支援單模組和多模組並存,配置檔案需要指定是否多模組,我覺得可以做成共存,這樣很容易實現控制器的復用,比如

thinkphp5原始碼解析 1 資料庫

tp5的資料庫操作全部通過db類完成,比較符合國人的習慣,比如簡單的db query db execute 還有複雜的鏈式操作db table user where id 1 select 下面就通過原始碼來了解其工作流程 假定配置檔案設定驅動為mysql,當執行以下 時,tp5的資料庫類是怎麼工作...

ThinkPHP5使用快取

cache 使用復合快取型別 type complex 預設使用的快取 default 驅動方式 type file 在這設定換人的快取方式 快取儲存目錄 path cache path,檔案快取 file 驅動方式 type file 設定不同的快取儲存目錄 path runtime path f...

thinkphp5內建標籤

知道內建標籤怎麼用,查手冊的時候好查 卻功能的時候在裡面找著來用 1 內建標籤23 變數輸出使用普通標籤就足夠了,但是要完成其他的控制 迴圈和判斷功能,就需要借助模板引擎的標籤庫 4功能了,系統內建標籤庫的所有標籤無需引入標籤庫即可直接使用。5內建標籤包括 6標籤名作用包含屬性 7include 包...