《PHP教程:詳解PHP的Yii框架的運(yùn)行機(jī)制及其路由功能》要點(diǎn):
本文介紹了PHP教程:詳解PHP的Yii框架的運(yùn)行機(jī)制及其路由功能,希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:YII框架
運(yùn)行機(jī)制概述
每一次 Yii 應(yīng)用開始處理 HTTP 哀求時(shí),它都會(huì)進(jìn)行一個(gè)近似的流程.PHP編程
下面的示意圖展示了應(yīng)用是如何處理一個(gè)哀求的.PHP編程
PHP編程
啟動(dòng)引導(dǎo)(Bootstrapping)
啟動(dòng)引導(dǎo)是指:在應(yīng)用開始解析并處理新接受哀求之前,一個(gè)預(yù)先準(zhǔn)備環(huán)境的過程.啟動(dòng)引導(dǎo)會(huì)在兩個(gè)地方具體進(jìn)行:入口腳本(Entry Script) 和 應(yīng)用主體(application).PHP編程
在入口腳本里,需注冊各個(gè)類庫的類文件自動(dòng)加載器(Class Autoloader,簡稱自動(dòng)加載器).這主要包括通過其 autoload.php 文件加載的 Composer 自動(dòng)加載器,以及通過 Yii 類加載的 Yii 自動(dòng)加載器.之后,入口腳本會(huì)加載應(yīng)用的 配置(configuration) 并創(chuàng)建一個(gè) 應(yīng)用主體 的實(shí)例.PHP編程
在應(yīng)用主體的構(gòu)造函數(shù)中,會(huì)執(zhí)行以下引導(dǎo)工作:PHP編程
因?yàn)橐龑?dǎo)工作必須在處理每一次哀求之前都進(jìn)行一遍,因此讓該過程盡可能輕量化就異常重要,請盡可能地優(yōu)化這一步驟.PHP編程
請盡量不要注冊太多引導(dǎo)組件.只有他需要在 HTTP 哀求處理的全部生命周期中都作用時(shí)才需要使用它.舉一個(gè)用到它的范例:一個(gè)模塊需要注冊額外的 URL 解析規(guī)則,就應(yīng)該把它列在應(yīng)用的 bootstrap 屬性之中,這樣該 URL 解析規(guī)則才能在解析哀求之前生效.(譯注:換言之,為了性能需要,除了 URL 解析等少量操作之外,絕大多數(shù)組件都應(yīng)該按需加載,而不是都放在引導(dǎo)過程中.)PHP編程
在生產(chǎn)環(huán)境中,可以開啟字節(jié)碼緩存,比如 APC,來進(jìn)一步最小化加載和解析 PHP 文件所需的時(shí)間.PHP編程
一些大型應(yīng)用都包含有非常復(fù)雜的應(yīng)用配置,它們會(huì)被分割到許多更小的配置文件中.此時(shí),可以考慮將整個(gè)配置數(shù)組緩存起來,并在入口腳本創(chuàng)建應(yīng)用實(shí)例之前直接從緩存中加載.PHP編程
yii的入口文件
這里使用了一個(gè)第三方的配置管理插件:marcovwout,來管理Yii的配置,細(xì)節(jié)我就不說了.剩下的就是就是一些基本的全局變量設(shè)置了.往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run辦法,一個(gè)web應(yīng)用是不是就這么跑起來了,是的,抽象到最高層就是這樣:我往一個(gè)容器里面?zhèn)魅雽?yīng)的配置,然后這個(gè)應(yīng)用可以基于該配置正常運(yùn)行起來.
說YiiBase中的兩個(gè)比較重要的辦法 (import,autoload)
PHP編程
PHP編程
這里使用了一個(gè)第三方的配置管理插件:marcovwout,來管理Yii的配置,細(xì)節(jié)我就不說了.剩下的就是就是一些基本的全局變量設(shè)置了.往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run辦法,一個(gè)web應(yīng)用是不是就這么跑起來了,是的,抽象到最高層就是這樣:我往一個(gè)容器里面?zhèn)魅雽?yīng)的配置,然后這個(gè)應(yīng)用可以基于該配置正常運(yùn)行起來.PHP編程
路由
當(dāng)入口腳本在調(diào)用 yii\web\Application::run() 方法時(shí),它進(jìn)行的第一個(gè)操作就是解析輸入的哀求,然后實(shí)例化對應(yīng)的控制器操作處理這個(gè)哀求.該過程就被稱為引導(dǎo)路由(routing).(譯注:中文里既是動(dòng)詞也是名詞)PHP編程
解析路由PHP編程
路由引導(dǎo)的第一步,是把傳入哀求解析為一個(gè)路由.如我們在 控制器(Controllers) 章節(jié)中所描述的那樣,路由是一個(gè)用于定位控制器操作的地址.這個(gè)過程通過 request 應(yīng)用組件的 yii\web\Request::resolve() 方法實(shí)現(xiàn),該方法會(huì)調(diào)用 URL 管理器 進(jìn)行實(shí)質(zhì)上的哀求解析工作.PHP編程
默認(rèn)情況下,傳入哀求會(huì)包含一個(gè)名為 r 的 GET 參數(shù),它的值即被視為路由.但是如果啟用 yii\web\UrlManager::enablePrettyUrl,那么在確定哀求的路由時(shí),就會(huì)進(jìn)行更多處理.具體的細(xì)節(jié)請參考 URL 的解析與生成 章節(jié).PHP編程
假使某路由最終實(shí)在無法被確定,那么 request 組件會(huì)拋出 yii\web\NotFoundHttpException 異常(譯注:大名鼎鼎的 404).PHP編程
缺省路由PHP編程
如果傳入哀求并沒有提供一個(gè)具體的路由,(一般這種情況多為于對首頁的哀求)此時(shí)就會(huì)啟用由 yii\web\Application::defaultRoute 屬性所指定的缺省路由.該屬性的默認(rèn)值為 site/index,它指向 site 控制器的 index 操作.你可以像這樣在應(yīng)用配置中調(diào)整該屬性的值:PHP編程
return [ // ... 'defaultRoute' => 'main/index', ];
catchAll 路由(全攔截路由)PHP編程
有時(shí)候,你會(huì)想要將你的 Web 應(yīng)用臨時(shí)調(diào)整到維護(hù)模式,所有的哀求下都會(huì)顯示相同的信息頁.當(dāng)然,要實(shí)現(xiàn)這一點(diǎn)有很多種方法.這里面最簡單快捷的方法就是在應(yīng)用配置中設(shè)置下 yii\web\Application::catchAll 屬性:PHP編程
return [ // ... 'catchAll' => ['site/offline'], ];
catchAll 屬性需要傳入一個(gè)數(shù)組做參數(shù),該數(shù)組的第一個(gè)元素為路由,剩下的元素會(huì)(以名值對的形式)指定綁定于該操作的各個(gè)參數(shù).PHP編程
當(dāng)設(shè)置了 catchAll 屬性時(shí),它會(huì)替換掉所有從輸入的哀求中解析出來的路由.如果是上文的這種設(shè)置,用于處理所有傳入哀求的操作都會(huì)是相同的 site/offline.PHP編程
創(chuàng)建操作PHP編程
一旦哀求路由被確定了,緊接著的步驟就是創(chuàng)建一個(gè)“操作(action)”對象,用以響應(yīng)該路由.PHP編程
路由可以用里面的斜杠分割成多個(gè)組成片段,舉個(gè)栗子,site/index 可以分解為 site 和 index 兩部分.每個(gè)片段都是指向某一模塊(Module)、控制器(Controller)或操作(action)的 ID.PHP編程
從路由的首個(gè)片段開始,應(yīng)用會(huì)經(jīng)過以下流程依次創(chuàng)建模塊(如果有),控制器,以及操作:PHP編程
在上面的步驟里,如果有任何錯(cuò)誤發(fā)生,都會(huì)拋出 yii\web\NotFoundHttpException,指出路由引導(dǎo)的過程失敗了.PHP編程
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP教程:詳解PHP的Yii框架的運(yùn)行機(jī)制及其路由功能》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7324.html