## 3. 批量定义
>[info] ###批量定义:一次创建多个路由规则,有二种注册方案:
![](https://box.kancloud.cn/aa5cf7becbe1ff03f88bf5d28ddf4784_752x133.png)
* * * * *
> 前面我们每调用一次Route:rule( )方法,仅创建了一个路由规则,本节课我们学习一次性创建多个路由规则的技巧。<br />
说到"批量"定义,大家脑海中第一闪现的名词是什么呢?相信你已经猜到了,是【数组】。<br/>
【数组】可以将相关的数据整合在一起,用来批量定义操作,再合适不过了~~
* * * * *
### 3-1. 动态批量定义规则语法:
>[success] ####图一:参数顺序:
![](https://box.kancloud.cn/df11065b035826d945b244dbeadce9d7_822x163.png)
>[success] ####图一:参数说明:
![](https://box.kancloud.cn/fdaec3d530c1ceabbad19724ab678bb3_885x428.png)
* * * * *
### 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] ###批量定义是路由操作中,最频繁的工作,请课下多多练习~~