最近因為工作需要用到cakephp這個PHP框架,由於之前用的比較少,加之最近看了些手冊感覺對cakephp裡面有些東西還不是很清楚,於是決定看下它的源代碼,下面是我看的過程中一些筆記
我覺得如果有興趣查看這個文檔的話最好是打開相應的PHP文件對照查看,要不然很有可能都不知道我在說什麼。
開始:
當我們從網上預設下載安裝以後,都會有app,cake , vendors三個目錄以及.htaccess,和index.php檔案。
根據手冊說明以及經驗,cake目錄為框架的核心程式碼同時也是我們開發的時候不需要動的一個目錄,這樣對我們以後升級框架核心是有幫助的。如果在開發過程中需要自己寫類,可以把檔案放在vendors目錄下面然後使用app::import等方法呼叫。 .htaccess和index.php會把預設存取請求傳遞給app/webroot/index.php檔案執行(如伺服器不支援.htaccess,則需要重新修改index.php檔案),最終我們可以確定app才是我們預設的主戰場!(當然這個是可以更改的,比如說幾個應用程式公用一個核心的情況,我這裡不細說了)
當打開app/webroot/index.php檔案以後,我們會發現這個檔案寫的非常簡單,開始一段程式碼定義了一些基本路徑的常數(如app路徑,更目錄路徑等),後麵包含了一個cake/bootstrap.php文件,也就是這個文件加載了所有框架所必需的資訊以及初始化工作,讓我們看看它到底做了些什麼。
下面的是bootstrap.php檔案裡面部分程式碼,我在裡面適當的加了一些註解
if (!isset($bootstrap)) {
; //定義了框架通用的函數方法
$TIME_START = getMicrotime();
. 'paths.php'; //檔案路徑定義檔
require LIBS . 'object.php'; //所有類別的父類
require LIBS . 'inflector.php'; //命名類,處理單複數已經駝峰命名等:如Inflector::pluralize('example'
require LIBS . 'configure.php'; //配置參數類別--裡面定義有重要的載入類別app::import ,以後我們就可以使用它進行類別檔案cache.php '; //載入快取引擎類別
Configure::getInstance(); //初始化設定文件,這裡會載入app/config/core.php以及app/config/bootstrap.php . 'Core', array('Dispatcher')); //導入路徑處理類,程式入口路徑等
在app/webroot/index.php檔案最後會呼叫$Dispatcher->dispatch方法執行程式
$Dispatcher = new Dispatcher(); //初始化路徑處理類別$Dispatcher->dispatch($url); //框架開始判斷URL執行程式
下面讓我們看看框架是如何載入Dispatcher並執行程式的吧!
首先在cake/ dispatcher.php檔案106行中我們會找到dispatch方法,預設我們傳遞給dispatch的參數會為空,當url參數為空的情況時,框架會自動呼叫getUrl方法得到url等資訊
$url = $this->getUrl(); //得到URL路徑
$this->params = array_merge($this->parseParams($url), $additionalParams); //得到處理URL後的數組,包括$_POST,$_GET傳遞過來的值,以及控制器和方法
程式透過parseParams方法處理URL參數並呼叫routes類別方法取得controller和action等資訊並組裝成有規律數組形式後傳遞給$this->params,值得注意的是,在後面的程式碼中$this->params會賦值給$controller->params,這就是為什麼我們可以在控制器可以使用$this->params的原因,例如:$this->params ['controller']會獲得目前請求的控制器名稱
其後會對目前的action做判斷,例如action名字前有下劃線(_)的會認為是受保護方法不予存取等
接下來會把一些參數等賦值給目前controller
程式碼如下
$controller->base = $this->base;
$controller->here = $this->here;
$controller->webroot = $this->webroot;
$ controller->plugin = $this->plugin;
$controller->params =& $this->params; //將所有的參數傳遞給$controller->plugin,包括controller和action名字以及form資料以及URL等
$controller->action =& $this->params['action'];
$controller->passedArgs = array_merge($this->params['pass'], $this->params['named']); //將所有$_GET傳遞的參數賦值給$controller->passedArgs 包含有無命名參數,如/controller/action/a:1/b=2/3/4
(注意:當controller在執行render方法後來會自動把一些變數傳遞給view也就是我們所說的模板,例如controller會把passedArgs變數值賦值給view裡面的passedArgs,以致我們在模板中可以直接呼叫$this->passedArgs)
這裡應該注意的是框架會判斷目前操作中是否會有$_POST,$_GET等值,如$_POST有字段名為data的字段,框架會執行$controller->data =& $this->params['data'];
最後改方法會呼叫目前controller並傳遞參數執行
程式碼如下:return $this->_invoke($controller, $this->params); //透過位址引用傳遞參數給$controller,呼叫$controller ,正式執行
下面看下調用的_invoke
function _invoke(&$controller, $params)
function _invoke(&$controller, $params) {
$controller->constructClasses(tro);資訊以及合併appController等(包括載入model,以及helper和Component),更多資訊請查看controller.php下的類別方法
$controller->Component->initialize($controller); //在控制器beforeFilter前調用component的initialize方法
$controller->beforeFilter();
$controller->Component->startup($controller);
在這裡我們可以看到$controller->Component->initialize是在$controller>beforeFilter ()之前執行的,這個手冊上都有提到我就不多說了
這裡要注意的是
$controller->constructClasses方法會合併當前用戶自訂controller類別和AppController(app_controller.php)中的一些變量,如$users以及helper和component等,這裡比較重要一點的是會循環調用所有$users變量下面的值並加載對應的model,如果$this->uses變量為false則不初始化任何model: 注意如果只想定義controller而不想定義相應的model檔案的時候,這個變數應該為空,或者如想在該控制器調用時自動加載其他的model的情況時,可以把想要的model名通過數組賦值給$ this->users=array('modelname1','modelname2')等,還有種情況就是當使用者並沒有自己設定$users的值的時候,框架會自動根據名字並嘗試呼叫對應的model(model檔案不是必須的,但此時資料庫中必須要有對應的表,否則會報錯)
其他的應該不用做什麼解釋說明
下面的
$output = $controller->dispatchMethod($params['action' ], $params['pass']);
這個方法是呼叫object類別裡面的dispatchMethod方法,其實也就是controller類別執行對應的action方法
下面一小段程式碼
if ($controller->autoRender) {
$controller->output = $controller->render() $controller->output = $output;
}
所有在$controller中如果我們有定義$ this->autoRender=false的話,框架是不會自動調用render方法的
如果$ this->autoRender為真的或沒有定義的時候,框架會調用render函數呼叫對應的模板顯示輸出最後的HTML了
這不過是一個簡化的執行流程,並沒有牽扯到model等內容,大家可以做為參考,因為我有時候有會覺得讀源代碼比看手冊更容易理解
以上就是cakephp執行流程程式碼解讀的內容,更多相關內容請關注PHP中文網(www.php.cn)!

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

HTTP緩存頭的關鍵玩家包括Cache-Control、ETag和Last-Modified。 1.Cache-Control用於控制緩存策略,示例:Cache-Control:max-age=3600,public。 2.ETag通過唯一標識符驗證資源變化,示例:ETag:"686897696a7c876b7e"。 3.Last-Modified指示資源最後修改時間,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)