[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);
依次类推。
```