## 3. 批量定義
>[info] ###批量定義:一次創建多個路由規則,有二種注冊方案:

* * * * *
> 前面我們每調用一次Route:rule( )方法,僅創建了一個路由規則,本節課我們學習一次性創建多個路由規則的技巧。<br />
說到"批量"定義,大家腦海中第一閃現的名詞是什么呢?相信你已經猜到了,是【數組】。<br/>
【數組】可以將相關的數據整合在一起,用來批量定義操作,再合適不過了~~
* * * * *
### 3-1. 動態批量定義規則語法:
>[success] ####圖一:參數順序:

>[success] ####圖一:參數說明:

* * * * *
### 3-2. 動態批量定義規則的實例:
>[info] 該實例涉及到模型操作,所以除了要創建控制器和路由配置文件外,還要創建模型文件
| 序號 | 文件用途 | 文件位置 |
| :---: | --- | --- |
|1| 控制器文件|/application/index/Index.php |
|2| 路由配置文件|/application/route.php|
|3| 模型文件|/application/model/Staff.php|
* * * * *
#### 第一步:創建模型文件,與數據表tp5_staff綁定
>[success] 因為模型通常為應用中各模塊所共享,所以在應用目錄中創建比較合適~~
~~~
<?php
namespace app\model;
use think\Model; //導入模型Model類
class Staff extends Model
{
//此處為自定義模型類的代碼
}
~~~
>[warning] 因為Model類是抽象類,所以必須創建其子類,才可以使用模型類中的屬性和方法
* * * * *
#### 第二步:創建控制器文件,并定義二個方法:
>[success] 只有創建一個以上的方法,才可以演示批量路由注冊的效果
~~~
<?php
namespace app\index\controller;
use think\Route; //導入路由類
use app\model\Staff; //導入自定義模型類
class Index
{
//創建demo方法,輸出歡迎信息
public function demo($study='kancloud', $name='php')
{
return '歡迎來'.$study.'學習'.$name.'開發技術!';
}
//update()根據傳入主鍵更新記錄的salary字段信息
public function update($id)
{
$res = Staff::update(['salary'=>3900],['id'=>$id]);
echo $res ? '更新成功!' : '更新失敗!';
}
}
~~~
>[warning] ####代碼分析:
1. demo( )方法:根據輸入參數,輸出一段歡迎信息;
2. update( )方法:根據傳入的數據表主鍵,更新salary字段值;
* * * * *
#### 第三步:創建路由配置文件:
>[success] 該文件中涉及到路由參數與變量規則,這二部分尚未學習,關鍵是理解語法,暫不必深究。
~~~
<?php
use think\Route; //導入路由類
//創建路由規則數組
$rule['update/:id'] = 'index/Index/update';
$rule['demo/:study/[:name]'] = ['index/Index/demo',['ext'=>'shtml'],['study'=>'[a-zA-z]{3,20}','name'=>'\w+']];
//將路由規則注冊到系統中
Route::rule($rule,'','GET',['ext'=>'html'],['id'=>'\d+']);
~~~
>[warning] ####代碼分析:
1. `use think\Route;`:首先要導入路由類,才可以調用其方法創建路由規則;
2. 由于路由規則較復雜,為便于閱讀,創建數組變量`$rule`,用于存放批量定義的路由規則;
3. `$rule['update/:id'] = 'index/index/update';`:當僅有路由地址,無路由參數和變量規則時,可直接將路由地址寫在字符串,不必創建數組;
4. `$rule['demo/:study/[:name]'] = ['index/index/demo'......;`:路由規則完整定義應放在數組中,數組中有三個元素:[1]路由地址 ,[2]路由參數,[3]變量規則,其中,變量規則部分采用了正則表達式;
5. `Route::rule($rule,'','GET',['ext'=>'html'],['id'=>'\d+']);`:路由注冊時,如果規則數組之外的參數設置,與規則數組內容有沖突,則以規則數組為主,如此例,外部定義的URL擴展名為:'html',規則數組中定義為'shtml',則最后生成的路由規則是'shtml'擴展名;
* * * * *
#### 第四步:路由測試:
>[info] 測試第1個路由規則:demo/:study/[:name]
* 瀏覽器地址欄輸入:
~~~
http://tp5.com/demo/lidaketang/thinkphp5.shtml
~~~
* 輸出結果如下:
~~~
歡迎來lidaketang學習thinkphp5開發技術!
~~~
> URL參數lidaketang和thinkphp5自動與demo()方法的參數$study和$name綁定,并且必須使用該規則定義的路由擴展名:shtml,而不是外部定義的:html;
* * * * *
>[info] 測試第2個路由規則:update/:id
* 瀏覽器地址欄輸入:
~~~
http://tp5.com/update/1016.html
~~~
* 顯示運行結果:
~~~
更新成功!
~~~
>URL參數中的1016為更新主鍵,自動與update方法$id參數綁定。因為沒有在規則內部設置路由參數,所以使用外部定義的路由參數(本例為'ext'=>'html'),所以URL擴展名為:html ;
* * * * *
### 3-3 靜態批量定義路由規則
>[info] ###動態路由規則由rule( )方法返回,靜態路由規則由路由規則數組返回。
* * * * *
>[success] ###靜態規則:'路由表達式'=>['路由地址','[路由參數]',['變量規則']]
**如沒有路由參數,請寫空數組:[ ],不允許留白。**
#### 3-3-1:實例演示
> 我們僅須簡單修改一下上面的路由配置文件:route.php
~~~
<?php
use think\Route; //導入路由類
//創建路由規則數組
$rule['update/:id'] = 'index/Index/update';
$rule['demo/:study/[:name]'] = ['index/Index/demo',['ext'=>'shtml'],['study'=>'[a-zA-z]{3,20}','name'=>'\w+']];
//將數組直接返回,完成路由注冊
return $rule;
~~~
#### 3-3-2:讓我們測試一下吧
>[info] 測試第1個路由規則:demo/:study/[:name]
* 瀏覽器地址欄輸入:
~~~
http://tp5.com/demo/ldkt/thinkphp5.shtml
~~~
* 輸出結果動態注冊完全一致:
~~~
歡迎來ldkt學習thinkphp5開發技術!
~~~
* * * * *
>[info] 測試第2個路由規則:update/:id
* 瀏覽器地址欄輸入:
~~~
http://tp5.com/update/1015.html
~~~
* 顯示運行結果:
~~~
更新成功!
~~~
* * * * *
## 總結:
>[success] ###批量定義是路由操作中,最頻繁的工作,請課下多多練習~~