局部变量规则
1、复制
/thinkphp/convention.php
文件中的url_param_type
配置项到自定义配置文件/config/config.php
中,进行自定义配置:
// URL参数方式 0 按名称成对解析 1 按顺序解析
'url_param_type' => 1,
并且使用按顺序解析的方式,简化路由规则。
2、修改/application/index/controller/Index.php
文件中的测试用方法:
class Index
{
public function test($name,$age)
{
return 'I am '.$name.', and I am '.$age.' old!';
}
}
3、修改/config/route.php
文件中的路由规则带上变量:
<?php
think\Route::get('test/:name/:age','index/index/test',[],[]);
4、但是此时的路由规则不严谨,因为没有对变量进行校验。
5、现在开始对变量进行校验:
<?php
think\Route::get('test/:name/:age','index/index/test',[],[
'name' => '[a-zA-Z]+', //name必须是a~z和A~Z之间的纯字符串,至少要有一个字符
'age' => '\d{2}', //age必须是一个整数,并且必须是两位数
]);
6、这样一旦输入的名字或年龄不符合规则,就会提示模块不存在。
全局变量规则
1、依旧回到上一个例子中,假设有多个路由规则都要用到name
和age
的变量规则,那么我们可以把这两个变量规则做成全局变量规则,使所有变量规则都可以使用。
2、/config/route.php
文件中写入全局变量规则:
<?php
think\Route::pattern([
'name' => '[a-zA-Z]+', //name必须是a~z和A~Z之间的纯字符串,至少要有一个字符
'age' => '\d{2}', //age必须是一个整数,并且必须是两位数
]);
think\Route::get('test/:name/:age','index/index/test',[],[]);//不需要单独再写
3、还能将全局变量规则和路由写在一起,从而简化整个规则:
return [
'__pattern__' => [
'name' => '[a-zA-Z]+', //name必须是a~z和A~Z之间的纯字符串,至少要有一个字符
'age' => '\d{2}', //age必须是一个整数,并且必须是两位数
],
'test/:name/:age' => 'index/index/test',
];
是不是清爽多了?
变量规则是路由中的一个重点,也是保证路由规则安全性的重要手段,当全局与局部变量规则作用在同一个路由变量上,局部规则覆盖全局规则,即局部的优先级高于全局。
网友评论