# 路由
當[入口腳本](http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts)在調用 yii\web\Application::run() 方法時,它進行的第一個操作就是解析輸入的請求,然后實例化對應的[控制器操作](http://www.yiichina.com/doc/guide/2.0/structure-controllers)處理這個請求。該過程就被稱為**引導路由(routing)**。(譯注:中文里既是動詞也是名詞)
## 解析路由
路由引導的第一步,是把傳入請求解析為一個路由。如我們在?[控制器(Controllers)](http://www.yiichina.com/doc/guide/2.0/structure-controllers#routes)?章節中所描述的那樣,路由是一個用于定位控制器操作的地址。這個過程通過?`request`?應用組件的 yii\web\Request::resolve() 方法實現,該方法會調用?[URL 管理器](http://www.yiichina.com/doc/guide/2.0/runtime-url-handling)?進行實質上的請求解析工作。
默認情況下,傳入請求會包含一個名為?`r`?的?`GET`?參數,它的值即被視為路由。但是如果啟用 yii\web\UrlManager::enablePrettyUrl,那么在確定請求的路由時,就會進行更多處理。具體的細節請參考?[URL 的解析與生成](http://www.yiichina.com/doc/guide/2.0/runtime-url-handling)?章節。
假使某路由最終實在無法被確定,那么?`request`?組件會拋出 yii\web\NotFoundHttpException 異常(譯注:大名鼎鼎的 404)。
### 缺省路由
如果傳入請求并沒有提供一個具體的路由,(一般這種情況多為于對首頁的請求)此時就會啟用由 yii\web\Application::defaultRoute 屬性所指定的缺省路由。該屬性的默認值為?`site/index`,它指向?`site`?控制器的?`index`?操作。你可以像這樣在應用配置中調整該屬性的值:
~~~
return [
// ...
'defaultRoute' => 'main/index',
];
~~~
### `catchAll`?路由(全攔截路由)
有時候,你會想要將你的 Web 應用臨時調整到維護模式,所有的請求下都會顯示相同的信息頁。當然,要實現這一點有很多種方法。這里面最簡單快捷的方法就是在應用配置中設置下 yii\web\Application::catchAll 屬性:
~~~
return [
// ...
'catchAll' => ['site/offline'],
];
~~~
`catchAll`?屬性需要傳入一個數組做參數,該數組的第一個元素為路由,剩下的元素會(以名值對的形式)指定綁定于該操作的各個參數。
當設置了?`catchAll`?屬性時,它會替換掉所有從輸入的請求中解析出來的路由。如果是上文的這種設置,用于處理所有傳入請求的操作都會是相同的?`site/offline`。
## 創建操作
一旦請求路由被確定了,緊接著的步驟就是創建一個“操作(action)”對象,用以響應該路由。
路由可以用里面的斜杠分割成多個組成片段,舉個栗子,`site/index`?可以分解為?`site`?和?`index`?兩部分。每個片段都是指向某一模塊(Module)、控制器(Controller)或操作(action)的 ID。
從路由的首個片段開始,應用會經過以下流程依次創建模塊(如果有),控制器,以及操作:
1. 設置應用主體為當前模塊。
2. 檢查當前模塊的 yii\base\Module::controllerMap 是否包含當前 ID。如果是,會根據該表中的配置創建一個控制器對象,然后跳到步驟五執行該路由的后續片段。
3. 檢查該 ID 是否指向當前模塊中 yii\base\Module::modules 屬性里的模塊列表中的一個模塊。如果是,會根據該模塊表中的配置創建一個模塊對象,然后會以新創建的模塊為環境,跳回步驟二解析下一段路由。
4. 將該 ID 視為控制器 ID,并創建控制器對象。用下個步驟解析路由里剩下的片段。
5. 控制器會在他的 yii\base\Controller::actions()里搜索當前 ID。如果找得到,它會根據該映射表中的配置創建一個操作對象;反之,控制器則會嘗試創建一個與該 ID 相對應,由某個 action 方法所定義的行內操作(inline action)。
在上面的步驟里,如果有任何錯誤發生,都會拋出 yii\web\NotFoundHttpException,指出路由引導的過程失敗了。
- 介紹(Introduction)
- 關于 Yii(About Yii)
- 從 Yii 1.1 升級(Upgrading from Version 1.1)
- 入門(Getting Started)
- 安裝 Yii(Installing Yii)
- 運行應用(Running Applications)
- 第一次問候(Saying Hello)
- 使用 Forms(Working with Forms)
- 玩轉 Databases(Working with Databases)
- 用 Gii 生成代碼(Generating Code with Gii)
- 更上一層樓(Looking Ahead)
- 應用結構(Application Structure)
- 結構概述(Overview)
- 入口腳本(Entry Scripts)
- 應用(Applications)
- 應用組件(Application Components)
- 控制器(Controllers)
- 模型(Models)
- 視圖(Views)
- 模塊(Modules)
- 過濾器(Filters)
- 小部件(Widgets)
- 前端資源(Assets)
- 擴展(Extensions)
- 請求處理(Handling Requests)
- 運行概述(Overview)
- 引導(Bootstrapping)
- 路由引導與創建 URL(Routing and URL Creation)
- 請求(Requests)
- 響應(Responses)
- Sessions and Cookies
- 錯誤處理(Handling Errors)
- 日志(Logging)
- 關鍵概念(Key Concepts)
- 組件(Components)
- 屬性(Properties)
- 事件(Events)
- 行為(Behaviors)
- 配置(Configurations)
- 別名(Aliases)
- 類自動加載(Class Autoloading)
- 服務定位器(Service Locator)
- 依賴注入容器(Dependency Injection Container)
- 配合數據庫工作(Working with Databases)
- 數據庫訪問(Data Access Objects): 數據庫連接、基本查詢、事務和模式操作
- 查詢生成器(Query Builder): 使用簡單抽象層查詢數據庫
- 活動記錄(Active Record): 活動記錄對象關系映射(ORM),檢索和操作記錄、定義關聯關系
- 數據庫遷移(Migrations): 在團體開發中對你的數據庫使用版本控制
- Sphinx
- Redis
- MongoDB
- ElasticSearch
- 接收用戶數據(Getting Data from Users)
- 創建表單(Creating Forms)
- 輸入驗證(Validating Input)
- 文件上傳(Uploading Files)
- 收集列表輸入(Collecting Tabular Input)
- 多模型同時輸入(Getting Data for Multiple Models)
- 顯示數據(Displaying Data)
- 格式化輸出數據(Data Formatting)
- 分頁(Pagination)
- 排序(Sorting)
- 數據提供器(Data Providers)
- 數據小部件(Data Widgets)
- 操作客戶端腳本(Working with Client Scripts)
- 主題(Theming)
- 安全(Security)
- 認證(Authentication)
- 授權(Authorization)
- 處理密碼(Working with Passwords)
- 客戶端認證(Auth Clients)
- 安全領域的最佳實踐(Best Practices)
- 緩存(Caching)
- 概述(Overview)
- 數據緩存(Data Caching)
- 片段緩存(Fragment Caching)
- 分頁緩存(Page Caching)
- HTTP 緩存(HTTP Caching)
- RESTful Web 服務
- 快速入門(Quick Start)
- 資源(Resources)
- 控制器(Controllers)
- 路由(Routing)
- 格式化響應(Response Formatting)
- 授權驗證(Authentication)
- 速率限制(Rate Limiting)
- 版本化(Versioning)
- 錯誤處理(Error Handling)
- 開發工具(Development Tools)
- 調試工具欄和調試器(Debug Toolbar and Debugger)
- 使用 Gii 生成代碼(Generating Code using Gii)
- TBD 生成 API 文檔(Generating API Documentation)
- 測試(Testing)
- 概述(Overview)
- 搭建測試環境(Testing environment setup)
- 單元測試(Unit Tests)
- 功能測試(Functional Tests)
- 驗收測試(Acceptance Tests)
- 測試夾具(Fixtures)
- 高級專題(Special Topics)
- 高級應用模版(Advanced Project Template)
- 從頭構建自定義模版(Building Application from Scratch)
- 控制臺命令(Console Commands)
- 核心驗證器(Core Validators)
- 國際化(Internationalization)
- 收發郵件(Mailing)
- 性能優化(Performance Tuning)
- 共享主機環境(Shared Hosting Environment)
- 模板引擎(Template Engines)
- 集成第三方代碼(Working with Third-Party Code)
- 小部件(Widgets)
- Bootstrap 小部件(Bootstrap Widgets)
- jQuery UI 小部件(jQuery UI Widgets)
- 助手類(Helpers)
- 助手一覽(Overview)
- Array 助手(ArrayHelper)
- Html 助手(Html)
- Url 助手(Url)