`ExpressPHP` 在路由配置文件 `application/route.php` 进行路由注册。
## 注册路由规则
引入命名空间
~~~
use sys\Route;
~~~
注册路由规则
>[info] Route::rule('路由表达式', '路由地址');
## 路由表达式
路由表达式是正则表达式的一部分,最终都会被 `Route` 转化为正则,例如:
~~~
Route::rule('news/forum/:name', '\app\controller\News->forum');
~~~
上面的路由表达式 `news/forum/:name` 将转化为:
~~~
`^news/forum/([\w-]+)`
~~~
根据正则表达式,路由表达式 `news/forum/:name` 能匹配下面的URL:
~~~
http://localhost/news/forum/10001
http://localhost/news/forum/v10001
http://localhost/news/forum/v-10001
~~~
### [ 变量 ]
` :name` 是一个变量,你可以随意命名,变量是可以定义规则的,没有定义规则的变量默认为 `[\w-]+`,变量所在URL段如果匹配成功,匹配的值将保存下来,可以通过 `Request` 类访问到,详情可查看请求类的文档。
~~~
use sys\Request;
echo Request::route('name');
~~~
>[success] 变量还可以在 **路由地址** 中使用
## 路由地址
路由地址 = 命名空间(目录 + 类名) + 方法名,例如:
~~~
Route::rule('news/forum/:name', '\app\controller\News->forum');
~~~
上面的路由地址 `\app\controller\News->forum` 分为三部分:
第一部分:目录
~~~
\app\controller\
~~~
第二部分:类名
~~~
News
~~~
第三部分:方法名
~~~
->forum
~~~
### [ 变量 ]
路由地址也能使用变量,但是只能在 **绑定方法模式** 中使用
>[warning] 请不要在路由地址的 **类名** 部分使用变量。
## 绑定方法模式
`ExpressPHP` 为了提高性能与效率,开发了该模式,只需注册一条路由规则,绑定的控制器下的所有方法都可在URL中访问,使用方式如下:
~~~
Route::rule('api/news/:method', '\app\controller\News\:method', Route::BIND_METHOD);
~~~
能匹配下面的URL:
~~~
http://localhost/api/news 路由至 app\webapi\controller\News->index()
http://localhost/api/news/ 路由至 app\webapi\controller\News->index()
http://localhost/api/news/article 路由至 app\webapi\controller\News->article()
http://localhost/api/news/edit_id 路由至 app\webapi\controller\News->editId()
~~~
变量使用在方法名部分时,例如:
~~~
\app\controller\News\:method
~~~
下划线分割命名会自动转换为驼峰命名,例如:
~~~
http://localhost/api/news/edit_id 路由至 app\webapi\controller\News->editId()
~~~
使用在目录部分时,不会转换,例如下面的 `:v` 变量:
~~~
Route::rule(':v/news/:method', '\app\:v\controller\News\:method', Route::BIND_METHOD);
~~~
## 完全匹配
规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$符号,例如:
~~~
Route::rule('news/article/:id$', 'webpage/controller/News/article');
~~~
下面的URL会匹配成功
~~~
http://localhost/api/news/article/10010
~~~
下面的URL会匹配失败
~~~
http://localhost/api/news/article/10010/2
~~~
## URL目录
有些URL是一个目录,例如:
~~~
http://localhost/news
http://localhost/news/
~~~
这样的URL在定义路由表达式时,需要以 `/*$` 结尾,例如:
~~~
Route::rule('news/*$', 'webpage/controller/News/index');
~~~
## 首页
配置首页路由如下:
~~~
Route::rule('/*$', '\app\controller\Index->index');
~~~
>[warning] 请不要在首页使用 **绑定方法模式** 。
为什么不能使用绑定方法模式?因为首页在所有框架设计中都比较特殊,首页会与URL目录生产歧义,比如:
~~~
http://localhost/news
~~~
到底要指向 Index 控制器的 news 方法,还是指向 news 控制器的 index 方法呢?所有框架都选择了后者,所以 ExpressPHP 不能在首页使用绑定方法模式。
