`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 不能在首頁使用綁定方法模式。