[TOC]
# 1.3 創建路由
## 1.3.1 路由定義
XPHP 內置了一個高效、簡潔、完整、易用的路由,支持多種方式調用。
路由,顧名思義,就是把訪問的URI(REQUEST_URI)映射(Map)到各個控制器(Controller)上。
## 1.3.2 靜態Json路由
在 `/Var/Route/` 目錄下存放靜態路由。
靜態路由支持Json格式。每一個路由為一個文件,命名規則:`應用名.json`。(其實只要后綴名是json就行,沒有其他要求)
### 1.3.2.1 一個標準的路由:
```json
[
{
"base" : "/home",
"rule" : {
"GET /" : "Home.IndexController:index",
"GET /about.html" : "Home.IndexController:about",
"POST /auth/{username}.json" : "Home.AuthController:auth"
}
}
]
```
### 1.3.2.2 解釋:
每一個路由都是一個json數組,其中每一項有兩個屬性:`base`和`rule`。其中`base`是路由的作用根目錄,例如`/home`只對開頭為`/home`的URI生效。它不支持解析,效率較高,并且能夠使代碼更優雅。
其中的`rule`字段是一個Map,每一項的鍵就是匹配的URI,支持標準正則語法,還有一個附加語法:其中被大括號括起來的部分,會匹配任意字符,最后會把匹配到的數據存儲到`request->data->route`中。(在控制器中,用`$req->data->route`或`$this->app->handler->getRequest()->data->route`可以訪問這一對象。)而值則為控制器名稱,格式:`應用名.控制器名:方法名`。
> tip: 用大括號包起來的部分中只能有英文大小寫,不能有數字,否則不能正常匹配哦!
## 1.3.3 動態路由
在`/Config.php`或其他通過`$app->runScript()`執行的腳本中,可以添加動態路由。
在這些動態腳本的函數主體中,添加:
```php
$App->route->on("GET,POST等訪問方式", "匹配的URI,和rule字段的key一樣", 回調函數);
```
其中,回調函數須為callable,例如閉包函數就符合。如果需要使用控制器,那么回調函數可以這么寫:
```php
$App->controllerAsCallback("控制器名,和rule字段的值一樣");
```
此外,還有如下替代寫法:
```php
$App->route->get("URI", callback); 對應 $App->route->on("get", "URI", callback);
$App->route->post("URI", callback); 對應 $App->route->on("post", "URI", callback);
$App->route->delete("URI", callback); 對應 $App->route->on("delete", "URI", callback);
$App->route->put("URI", callback); 對應 $App->route->on("put", "URI", callback);
$App->route->patch("URI", callback); 對應 $App->route->on("patch", "URI", callback);
$App->route->cli("URI", callback); 對應 $App->route->on("cli", "URI", callback);
依次類推。
```