欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解PHP的Yii框架的運行機制及其路由功能

 更新時間:2016年03月17日 15:00:26   作者:柏樹_Jeff  
這篇文章主要介紹了PHP的Yii框架的運行機制及其路由功能,Yii是一個基于組件的重量級的PHP框架,適合用來開發(fā)大型網(wǎng)站,需要的朋友可以參考下

運行機制概述
每一次 Yii 應(yīng)用開始處理 HTTP 請求時,它都會進行一個近似的流程。

  • 用戶提交指向 入口腳本 web/index.php 的請求。
  • 入口腳本會加載 配置數(shù)組 并創(chuàng)建一個 應(yīng)用 實例用于處理該請求。
  • 應(yīng)用會通過 request(請求) 應(yīng)用組件解析被請求的 路由。
  • 應(yīng)用創(chuàng)建一個 controller(控制器) 實例具體處理請求。
  • 控制器會創(chuàng)建一個 action(動作) 實例并為該動作執(zhí)行相關(guān)的 Filters(訪問過濾器)。
  • 如果任何一個過濾器驗證失敗,該動作會被取消。
  • 如果全部的過濾器都通過,該動作就會被執(zhí)行。
  • 動作會加載一個數(shù)據(jù)模型,一般是從數(shù)據(jù)庫中加載。
  • 動作會渲染一個 View(視圖),并為其提供所需的數(shù)據(jù)模型。
  • 渲染得到的結(jié)果會返回給 response(響應(yīng)) 應(yīng)用組件。
  • 響應(yīng)組件會把渲染結(jié)果發(fā)回給用戶的瀏覽器。

下面的示意圖展示了應(yīng)用是如何處理一個請求的。

2016317145658183.png (1144×876)

啟動引導(dǎo)(Bootstrapping)
啟動引導(dǎo)是指:在應(yīng)用開始解析并處理新接受請求之前,一個預(yù)先準(zhǔn)備環(huán)境的過程。啟動引導(dǎo)會在兩個地方具體進行:入口腳本(Entry Script) 和 應(yīng)用主體(application)。

在入口腳本里,需注冊各個類庫的類文件自動加載器(Class Autoloader,簡稱自動加載器)。這主要包括通過其 autoload.php 文件加載的 Composer 自動加載器,以及通過 Yii 類加載的 Yii 自動加載器。之后,入口腳本會加載應(yīng)用的 配置(configuration) 并創(chuàng)建一個 應(yīng)用主體 的實例。

在應(yīng)用主體的構(gòu)造函數(shù)中,會執(zhí)行以下引導(dǎo)工作:

  • 調(diào)用 yii\base\Application::preInit()(預(yù)初始化)方法,配置一些高優(yōu)先級的應(yīng)用屬性,比如 yii\base\Application::basePath 屬性。
  • 注冊yii\base\Application::errorHandler。
  • 通過給定的應(yīng)用配置初始化應(yīng)用的各屬性。
  • 通過調(diào)用 yii\base\Application::init()(初始化)方法,它會順次調(diào)用 yii\base\Application::bootstrap() 從而運行引導(dǎo)組件。
  • 加載擴展清單文件(extension manifest file) vendor/yiisoft/extensions.php。
  • 創(chuàng)建并運行各個擴展聲明的 引導(dǎo)組件(bootstrap components)。
  • 創(chuàng)建并運行各個 應(yīng)用組件 以及在應(yīng)用的 Bootstrap 屬性中聲明的各個 模塊(modules)組件(如果有)。

因為引導(dǎo)工作必須在處理每一次請求之前都進行一遍,因此讓該過程盡可能輕量化就異常重要,請盡可能地優(yōu)化這一步驟。

請盡量不要注冊太多引導(dǎo)組件。只有他需要在 HTTP 請求處理的全部生命周期中都作用時才需要使用它。舉一個用到它的范例:一個模塊需要注冊額外的 URL 解析規(guī)則,就應(yīng)該把它列在應(yīng)用的 bootstrap 屬性之中,這樣該 URL 解析規(guī)則才能在解析請求之前生效。(譯注:換言之,為了性能需要,除了 URL 解析等少量操作之外,絕大多數(shù)組件都應(yīng)該按需加載,而不是都放在引導(dǎo)過程中。)

在生產(chǎn)環(huán)境中,可以開啟字節(jié)碼緩存,比如 APC,來進一步最小化加載和解析 PHP 文件所需的時間。

一些大型應(yīng)用都包含有非常復(fù)雜的應(yīng)用配置,它們會被分割到許多更小的配置文件中。此時,可以考慮將整個配置數(shù)組緩存起來,并在入口腳本創(chuàng)建應(yīng)用實例之前直接從緩存中加載。


yii的入口文件
這里使用了一個第三方的配置管理插件:marcovwout,來管理Yii的配置,細節(jié)我就不說了。剩下的就是就是一些基本的全局變量設(shè)置了。往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run方法,一個web應(yīng)用是不是就這么跑起來了,是的,抽象到最高層就是這樣:我往一個容器里面?zhèn)魅雽?yīng)的配置,然后這個應(yīng)用可以基于該配置正常運行起來。
說YiiBase中的兩個比較重要的方法 (import,autoload)

2016317145740223.png (561×219)

這里使用了一個第三方的配置管理插件:marcovwout,來管理Yii的配置,細節(jié)我就不說了。剩下的就是就是一些基本的全局變量設(shè)置了。往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run方法,一個web應(yīng)用是不是就這么跑起來了,是的,抽象到最高層就是這樣:我往一個容器里面?zhèn)魅雽?yīng)的配置,然后這個應(yīng)用可以基于該配置正常運行起來。

路由
當(dāng)入口腳本在調(diào)用 yii\web\Application::run() 方法時,它進行的第一個操作就是解析輸入的請求,然后實例化對應(yīng)的控制器操作處理這個請求。該過程就被稱為引導(dǎo)路由(routing)。(譯注:中文里既是動詞也是名詞)

解析路由

路由引導(dǎo)的第一步,是把傳入請求解析為一個路由。如我們在 控制器(Controllers) 章節(jié)中所描述的那樣,路由是一個用于定位控制器操作的地址。這個過程通過 request 應(yīng)用組件的 yii\web\Request::resolve() 方法實現(xiàn),該方法會調(diào)用 URL 管理器 進行實質(zhì)上的請求解析工作。

默認(rèn)情況下,傳入請求會包含一個名為 r 的 GET 參數(shù),它的值即被視為路由。但是如果啟用 yii\web\UrlManager::enablePrettyUrl,那么在確定請求的路由時,就會進行更多處理。具體的細節(jié)請參考 URL 的解析與生成 章節(jié)。

假使某路由最終實在無法被確定,那么 request 組件會拋出 yii\web\NotFoundHttpException 異常(譯注:大名鼎鼎的 404)。

缺省路由

如果傳入請求并沒有提供一個具體的路由,(一般這種情況多為于對首頁的請求)此時就會啟用由 yii\web\Application::defaultRoute 屬性所指定的缺省路由。該屬性的默認(rèn)值為 site/index,它指向 site 控制器的 index 操作。你可以像這樣在應(yīng)用配置中調(diào)整該屬性的值:

return [
  // ...
  'defaultRoute' => 'main/index',
];

catchAll 路由(全攔截路由)

有時候,你會想要將你的 Web 應(yīng)用臨時調(diào)整到維護模式,所有的請求下都會顯示相同的信息頁。當(dāng)然,要實現(xiàn)這一點有很多種方法。這里面最簡單快捷的方法就是在應(yīng)用配置中設(shè)置下 yii\web\Application::catchAll 屬性:

return [
  // ...
  'catchAll' => ['site/offline'],
];

catchAll 屬性需要傳入一個數(shù)組做參數(shù),該數(shù)組的第一個元素為路由,剩下的元素會(以名值對的形式)指定綁定于該操作的各個參數(shù)。

當(dāng)設(shè)置了 catchAll 屬性時,它會替換掉所有從輸入的請求中解析出來的路由。如果是上文的這種設(shè)置,用于處理所有傳入請求的操作都會是相同的 site/offline。

創(chuàng)建操作

一旦請求路由被確定了,緊接著的步驟就是創(chuàng)建一個“操作(action)”對象,用以響應(yīng)該路由。

路由可以用里面的斜杠分割成多個組成片段,舉個栗子,site/index 可以分解為 site 和 index 兩部分。每個片段都是指向某一模塊(Module)、控制器(Controller)或操作(action)的 ID。

從路由的首個片段開始,應(yīng)用會經(jīng)過以下流程依次創(chuàng)建模塊(如果有),控制器,以及操作:

  • 設(shè)置應(yīng)用主體為當(dāng)前模塊。
  • 檢查當(dāng)前模塊的 yii\base\Module::controllerMap 是否包含當(dāng)前 ID。如果是,會根據(jù)該表中的配置創(chuàng)建一個控制器對象,然后跳到步驟五執(zhí)行該路由的后續(xù)片段。
  • 檢查該 ID 是否指向當(dāng)前模塊中 yii\base\Module::modules 屬性里的模塊列表中的一個模塊。如果是,會根據(jù)該模塊表中的配置創(chuàng)建一個模塊對象,然后會以新創(chuàng)建的模塊為環(huán)境,跳回步驟二解析下一段路由。
  • 將該 ID 視為控制器 ID,并創(chuàng)建控制器對象。用下個步驟解析路由里剩下的片段。
  • 控制器會在他的 yii\base\Controller::actions()里搜索當(dāng)前 ID。如果找得到,它會根據(jù)該映射表中的配置創(chuàng)建一個操作對象;反之,控制器則會嘗試創(chuàng)建一個與該 ID 相對應(yīng),由某個 action 方法所定義的行內(nèi)操作(inline action)。

在上面的步驟里,如果有任何錯誤發(fā)生,都會拋出 yii\web\NotFoundHttpException,指出路由引導(dǎo)的過程失敗了。

相關(guān)文章

  • php mysql實現(xiàn)mysql_select_db選擇數(shù)據(jù)庫

    php mysql實現(xiàn)mysql_select_db選擇數(shù)據(jù)庫

    在PHP中,與MySQL服務(wù)器建立連接后,需要確定所要連接的數(shù)據(jù)庫,此時我們可以使用mysql_select_db函數(shù),該函數(shù)用于選擇需要操作的數(shù)據(jù)庫,需要的朋友可以參考下
    2016-12-12
  • PHP中如何判斷AJAX提交的數(shù)據(jù)

    PHP中如何判斷AJAX提交的數(shù)據(jù)

    這是一個比較常用的方法,有時候我們需要知道一個頁面是被直接訪問的還是通過ajax來訪問的
    2012-02-02
  • PHP獲取數(shù)組最大值下標(biāo)的方法

    PHP獲取數(shù)組最大值下標(biāo)的方法

    這篇文章主要介紹了PHP獲取數(shù)組最大值下標(biāo)的方法,涉及php中max及array_search等函數(shù)操作數(shù)組的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • PHP生成zip壓縮包的常用方法示例

    PHP生成zip壓縮包的常用方法示例

    這篇文章主要介紹了PHP生成zip壓縮包的常用方法,結(jié)合實例形式分析了php使用zip格式壓縮文件、目錄以及壓縮并下載的相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • PHP設(shè)計模式之模板模式定義與用法詳解

    PHP設(shè)計模式之模板模式定義與用法詳解

    這篇文章主要介紹了PHP設(shè)計模式之模板模式定義與用法,較為詳細的說明了模板模式的原理、功能、應(yīng)用及php定義、使用模板模式的相關(guān)操作技巧,代碼簡單易懂,需要的朋友可以參考下
    2018-12-12
  • php生成圖片驗證碼的實例講解

    php生成圖片驗證碼的實例講解

    本文將通過實例講解使用PHP生成圖片驗證碼,并介紹生成驗證碼的函數(shù),需要的朋友可以參考下
    2015-08-08
  • PHP HTML代碼串 截取實現(xiàn)代碼

    PHP HTML代碼串 截取實現(xiàn)代碼

    將一段文字截取一定的物理長度顯示,注意,要截取的不是字符串的字節(jié)數(shù),UFT-8 的編碼中文字符是3個字節(jié)或者4個字節(jié)的,而顯示的時候中文會占兩個字符的長度,英文字符只占一個,全角的時候又有不同。
    2009-06-06
  • php 無限級緩存的類的擴展

    php 無限級緩存的類的擴展

    根據(jù)條件建立分類緩存減少類別使用
    2009-03-03
  • PHP 日志縮略名的創(chuàng)建函數(shù)代碼

    PHP 日志縮略名的創(chuàng)建函數(shù)代碼

    PHP創(chuàng)建日志縮略名函數(shù)代碼,用于創(chuàng)建用戶友好的日志縮略名。
    2010-05-05
  • php post換行的方法

    php post換行的方法

    在本篇文章里小編給大家整理了關(guān)于php post換行的方法以及實例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02

最新評論