## 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] ###批量定义是路由操作中,最频繁的工作,请课下多多练习~~