首頁 後端開發 php教程 cakephp執行流程程式碼解讀

cakephp執行流程程式碼解讀

Dec 20, 2016 am 09:40 AM

最近因為工作需要用到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)! 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

在本章中,我們將了解CakePHP中的環境變數、常規配置、資料庫配置和電子郵件配置。

CakePHP 使用資料庫 CakePHP 使用資料庫 Sep 10, 2024 pm 05:25 PM

在 CakePHP 中使用資料庫非常容易。本章我們將了解CRUD(建立、讀取、更新、刪除)操作。

如何使用CakePHP中的資料庫查詢建構器? 如何使用CakePHP中的資料庫查詢建構器? Jun 04, 2023 am 09:02 AM

CakePHP是一個開源的PHPMVC框架,它廣泛用於Web應用程式的開發。 CakePHP具有許多功能和工具,其中包括一個強大的資料庫查詢建構器,用於互動效能資料庫。此查詢建構器可讓您使用物件導向的語法執行SQL查詢,而不必編寫繁瑣的SQL語句。本文將介紹如何使用CakePHP中的資料庫查詢建構器。建立資料庫連線在使用資料庫查詢建構器之前,您首先需要在Ca

如何在CakePHP中建立自訂分頁? 如何在CakePHP中建立自訂分頁? Jun 04, 2023 am 08:32 AM

CakePHP是一個強大的PHP框架,為開發人員提供了許多有用的工具和功能。其中之一是分頁,它可以幫助我們將大量資料分成幾頁,從而簡化瀏覽和操作。預設情況下,CakePHP提供了一些基本的分頁方法,但有時你可能需要建立一些自訂的分頁方法。這篇文章將向您展示如何在CakePHP中建立自訂分頁。步驟1:建立自訂分頁類別首先,我們需要建立一個自訂分頁類別。這個

CakePHP 建立驗證器 CakePHP 建立驗證器 Sep 10, 2024 pm 05:26 PM

可以透過在控制器中新增以下兩行來建立驗證器。

CakePHP如何處理檔案上傳? CakePHP如何處理檔案上傳? Jun 04, 2023 pm 07:21 PM

CakePHP是一個開源的Web應用程式框架,它基於PHP語言構建,可以簡化Web應用程式的開發過程。在CakePHP中,處理文件上傳是常見的需求,無論是上傳頭像、圖片或文檔,都需要在程式中實現對應的功能。本文將介紹CakePHP中如何處理文件上傳的方法和一些注意事項。在Controller中處理上傳檔案在CakePHP中,上傳檔案的處理通常在Cont

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

在本章中,我們將學習以下與路由相關的主題?

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

See all articles