[TOC]
### 組件說明
1. Lying只支持一種路由模式:rewrite,如果你的服務器并不能配置rewrite,且移步其他框架吧
2. rewrite
當你的web服務器支持rewrite,并且你按照Lying的[部署](deploy.md)章節設置了rewrite規則,你可以這樣訪問網站:
~~~
http://domain/module/controller/action/param/value
~~~
### 配置選項
| 配置名 | 參數類型 | 可選 | 默認值 | 說明 |
| --- | --- | --- | --- | --- |
| class | string | 是 | lying\service\Router | 不可更改 |
| binding | bool | 是 | null | 默認路由是否綁定模塊 |
| module | string | 是 | index | 默認模塊 |
| controller | string | 是 | index | 默認控制器 |
| action | string | 是 | index | 默認方法 |
| suffix | string\|bool | 是 | false | 使用的后綴名 |
| rule | array | 是 | [] | 路由規則 |
| host | array | 是 | [] | 域名模塊綁定 |
### 示例配置
* 路由配置對大小寫敏感。
* 可選參數如果不需要都應該被注釋或者設置成等同于false的值。
* 域名綁定模塊里的參數如果不設置,會默認繼承父級配置。
~~~php
'router' => [
'class' => 'lying\service\Router', //路由完整類名,可以不寫,因為是核心組件
'binding' => true, //默認路由是否綁定模塊
'module' => 'index', //默認模塊,默認index
'controller' => 'index',//默認控制器,默認index
'action' => 'index', //默認方法,默認index
'suffix' => '.html', //使用的后綴名,默認空
'rule' => [ //路由規則
//如果binding為false,規則對應的路徑應該為全部小寫,并且是從[模塊]開始寫
//如果binding為true,規則對應的路徑應該為全部小寫,并且是從[控制器]開始寫
//設置規則后原url失效;規則匹配是從上到下,匹配到了就不會繼續下一條匹配
'blog/<id:\d+>/<name>$' => ['admin/blog/get', '.htm'],
'user/<name>/<id>$' => ['user/info/name'],
'yoyo' => ['index/index/index'],
],
'host' => [ //域名模塊綁定
'api.lying.com' => [ //域名,域名綁定的`binding`參數固定為true
'module' => 'index', //域名綁定的模塊,默認繼承上述配置
'controller' => 'index',//默認控制器,默認繼承上述配置
'action' => 'index', //默認方法,默認繼承上述配置
'suffix' => '.js', //使用的后綴名,默認繼承上述配置
'rule' => [ //路由規則,默認繼承上述配置
//規則對應的路徑應該為全部小寫,并且是從[控制器]開始寫
//設置規則后原url失效;規則匹配是從上到下,匹配到了就不會繼續下一條匹配
'user/<id>$' => ['index/user', '.html'],
],
],
],
],
~~~
> binding配置項說明:binding為true的時候,默認路由綁定默認配置項的`module`配置,所以路由規則`rule`的形式應該是`'user/<id>$' => ['index/user']`,而不是`'blog/<id>$' => ['admin/index/user']`
看到這么一大堆配置是不是頭大?我也很頭大!只能用舉栗子來說明了。
#### DEMO1
配置文件:
~~~php
'router' => [
],
~~~
~~~html
http://domain
這時候訪問的模塊為`index`,控制器為`IndexCtrl`,方法為`index`
~~~
~~~html
http://domain/a/b/c
這時候訪問的模塊為`a`,控制器為`BCtrl`,方法為`c`
~~~
#### DEMO2
配置文件:
~~~php
'router' => [
'module' => 'admin',
'controller' => 'user',
'action' => 'add',
'suffix' => '.html',
],
~~~
~~~html
http://domain/ //訪問的模塊為`admin`,控制器為`UserCtrl`,方法為`add`
http://domain/user/name.html //訪問的模塊為`user`,控制器為`NameCtrl`,方法為`add`
http://domain/index/post/del/id/1.html //訪問的模塊為`index`,控制器為`PostCtrl`,方法為`del`,并且帶有一個GET參數`id`,值為1
http://domain/user/ //訪問的模塊為`user`,控制器為`UserCtrl`,方法為`add`
~~~
#### 小結
> * 如果設置了module、controller、action,只有在路由缺省模塊、控制器、方法的時候,才會使用到默認模塊、默認控制器和默認方法;如果沒有設置module、controller、action,那么默認分別是index、index、index。
> * 如果配置了suffix選項,那么可以帶上后綴訪問,也可以不帶;如果沒有配置后綴,那么帶上后綴訪問就會報404。
### 路由規則
先記住下面幾點:
* 如果模塊目錄為`wechatApi`,那么模塊在路由和配置中的表現為`wechat-api`。
* 如果控制器為`UserListCtrl`,那么控制器在路由和配置中的表現為`user-list`。
* 如果方法為`delUser`,那么方法在路由和配置中的表現為`del-user`。
好了,我們開始講路由規則:
#### DEMO1
配置文件:
~~~php
'router' => [
'rule' => [
'user'=>['index/index/name'],
],
],
~~~
~~~html
http://domain/user/
實際上你訪問到的是
http://domain/index/index/name/
~~~
~~~html
http://domain/user/sex/1/
實際上你訪問到的是
http://domain/index/index/name/sex/1/
你可以使用$_GET['sex']來獲取到參數
~~~
> 如果你剛好有一個模塊名為`user`,那么你將不能通過`http://domain/user/`訪問`user`模塊,所以設置路由規則的時候請注意。
#### DEMO2
配置文件:
~~~php
'router' => [
'rule' => [
'user/<id>'=>['index/index/name'],
],
],
~~~
~~~html
http://domain/user/1/
實際上你訪問到的是
http://domain/index/index/name/id/1/
你可以使用$_GET['id']來獲取到參數
~~~
#### DEMO3
配置文件:
~~~php
'router' => [
'rule' => [
'user/<id:^\d+$>'=>['index/index/name'],
],
],
~~~
~~~html
http://domain/user/1/
實際上你訪問到的是
http://domain/index/index/name/id/1/
你可以使用$_GET['id']來獲取到參數
~~~
~~~html
http://domain/user/1/name/lying/
實際上你訪問到的是
http://domain/index/index/name/id/1/name/lying/
你可以使用$_GET['id']、$_GET['name']來獲取到參數
~~~
~~~html
http://domain/user/abc/
因為`abc`不匹配正則/^\d+$/,這時候嘗試訪問user模塊下的AbcCtrl控制器,如果不存在則報404錯誤。
~~~
#### DEMO4
配置文件:
~~~php
'router' => [
'rule' => [
'user/<id:^\d+$>$'=>['index/index/name', '.xml'],
],
],
~~~
~~~html
http://domain/user/1.xml
實際上你訪問到的是
http://domain/index/index/name/id/1/
你可以使用$_GET['id']來獲取到參數id
~~~
~~~html
http://domain/user/1/name/lying.xml
這條路徑不匹配規則,因為規則定義path只到id就結束了,注意`$`符號
所以實際上你訪問到的是
http://domain/user/1/name/lying.xml
就會報404錯誤啦
~~~
~~~html
http://domain/user/123/
因為`abc`不匹配后綴`.xml`,這時候報404錯誤。
~~~
#### 小結
> * 為路由參數設置正則,只要有一個正則不匹配就認為不匹配。
> * 不是所有的參數都必須設置匹配規則。
> * 如果設置了參數,參數就必須存在才能匹配到路由。
> * 如果設置了多個路由,則按照從上到下的順序匹配,匹配到了就不會進行下一條路由規則的匹配。
> * 如果所有的規則都不匹配,就按照`模塊/控制器/方法`來解析路由;binding模式下就按照`控制器/方法`來解析路由。
### 調用方式
~~~php
\Lying::$maker->get('router');
\Lying::$maker->router();
\Lying::$maker->router;
~~~
### URL生成
#### DEMO
配置文件:
~~~php
'router' => [
'module' => 'index',
'controller' => 'user',
'action' => 'name',
'suffix' => '.html',
'rule' => [
'user' => ['index/index/name'],
'admin/<id>' => ['admin/money/count', '.xml'],
'qq/<num:\d+>$' => ['qq/info/get-num', '.js'],
],
],
~~~
此次請求路徑為:
~~~html
http://domain/
~~~
~~~php
1. \Lying::$maker->router->createUrl('sex');
http://domain/index/user/sex.html
2. \Lying::$maker->router->createUrl('money/count');
http://domain/index/money/count.html
3. \Lying::$maker->router->createUrl('user/money/count');
http://domain/user/money/count.html
4. \Lying::$maker->router->createUrl('index/name');
http://domain/user.html
5. \Lying::$maker->router->createUrl('index/index/name');
http://domain/user.html
6. \Lying::$maker->router->createUrl('admin/money/count', ['id'=>1]);
http://domain/admin/1.xml
7. \Lying::$maker->router->createUrl('admin/money/count');
http://domain/admin/money/count.html
8. \Lying::$maker->router->createUrl('qq/num/stat', ['name'=>'qq'], false, true);
/qq/num/stat.html?name=qq
9. \Lying::$maker->router()->createUrl('admin/money/count', ['id'=>1, 'name'=>'lying']);
http://domain/admin/1/name/lying.xml
10. \Lying::$maker->router()->createUrl('qq/info/get-num', ['num'=>296399959, 'name'=>'lying']);
http://domain/qq/296399959.js?name=lying
~~~
#### 路由生成規則
路由判斷:
* `index => '當前模塊/當前控制器/index'`
* `index/name => '當前模塊/index/name'`
* `admin/user/list => 'admin/user/list'`
* `/admin/user => '/admin/user'`
* `/admin/user.html => '/admin/user.html'`
規則匹配:
* 如果在rule上有定義要生成的路徑url,并且參數個數剛好、參數格式匹配的話,就會反解析成路由規則所定義的url。當然,如果你的參數比路由設置上的多了,這樣并不影響路由匹配,并且還是能獲取GET參數。
### 方法列表
~~~php
/**
* 返回此次請求的模塊ID
* @return string
*/
public function module();
~~~
*****
~~~php
/**
* 返回此次請求的控制器ID
* @return string
*/
public function controller();
~~~
*****
~~~php
/**
* 返回此次請求的方法ID
* @return string
*/
public function action();
~~~
*****
~~~php
/**
* URL生成
* ```php
* 路徑[/index/blog/info],生成[/index/blog/info],使用此形式的時候請注意參數匹配,并且不會路由反解析
* 路徑[post],生成[當前模塊/當前控制器/post]
* 路徑[post/index],生成[當前模塊/post/index]
* 路徑[admin/post/index],生成[admin/post/index],注意:此用法在模塊綁定中會變成[post/index],模塊綁定模式下,只需要最多到控制器就行
* ```
* @param string $path 路徑
* @param array $params 參數數組,不合法的參數將被剔除,如果有路由規則,參數中必須包含rule中的參數才能反解析
* @param bool $host 是否攜帶完整域名,包含協議頭,默認是
* @param bool $normal 是否把參數設置成?a=1&b=2,默認否,優先pathinfo
* @return string 返回生成的URL
*/
public function createUrl($path, array $params = [], $host = true, $normal = false);
~~~
- 序言
- 更新日志
- 安裝
- 規范
- 常量
- 配置
- 自動加載
- MVC
- 模塊
- 控制器
- 模型
- 視圖
- php原生模板
- 模板引擎
- 變量輸出
- 模板注釋
- 模板繼承
- 模板引用
- 流程控制
- 原樣輸出
- 服務組件
- Hook組件
- Request組件
- Router組件
- Cookie組件
- Encrypter組件
- Dispatch組件
- Response組件
- View組件
- Session組件
- Helper組件
- 數據分頁
- 數據驗證
- Logger組件
- Cache組件
- Redis組件
- Connection組件
- 執行sql語句
- 查詢生成器
- 查詢方法詳解
- Schema
- Captcha組件
- CLI
- CLI工具
- 事件
- 類事件
- 實例事件
- 全局事件
- 助手函數
- 擴展
- 異常
- 部署
- Apache
- Nginx
- IIS
- 虛擬主機