路由引導(dǎo)與創(chuàng)建 URL(Routing and URL Creation)

2018-02-24 15:40 更新

路由

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

解析路由

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

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

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

缺省路由

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

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

catchAll?路由(全攔截路由)

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

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

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

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

創(chuàng)建操作

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

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

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

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

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)