通过本文你可以学到:
- 路由变量规则
- 路由参数
回忆
上一篇文章中,在使用 Route::get()
注册路由的时候我们特意强调过这个方法不止两个参数。上一篇文章中我们仅仅是使用了前面两个参数:路由规则和路由地址。本文将讲解后面两个参数:路由参数和变量规则。
当然,不仅仅是
Route::get()
,Route::post()
,Route::delete()
等等都是一样的。
这些方法的具体参数如下:
/**
* 注册GET路由
* @access public
* @param string $rule 路由规则
* @param string $route 路由地址
* @param array $option 路由参数
* @param array $pattern 变量规则
* @return void
*/
public static function get($rule, $route = '', $option = [], $pattern = [])
{
//...
}
路由变量规则
现在我们这样一个需求:我们访问 member/1
显示的是会员ID为1的资料页,如果我们访问 member/a
就会报错,也就是 member/
后面只能是数字,非数字一律报错。上一篇文章中我们对于 member/1
的访问定义了下面的规则:
Route::get('member/:id', 'index/member/profile');
如果你有运行的话你会发现,访问 member/1
或者访问 member/a
都是会映射到 index/member/profile
这个方法,显然这个是不符合上面的需求的。所以呢,路由变量规则就是解决此类问题的咯。
Q:什么是路由变量规则?
A:限制路由中变量范围的一条正则表达式
Q:路由变量规则有什么用?
A:限制 URL
的匹配范围,做到更加精准,更加安全。
那上面没有显示使用变量规则的路由注册语句来说:
Route::get('member/:id', 'index/member/profile');
我们要限制它的 :id
只能为数字,我们可以在方法的第四个参数这样写:
Route::get('member/:id', 'index/member/profile', [], ['id' => '\d+']);
可能您需要一点正则表达式的基础哦。
参数具体结构如下:
[
'变量名' => '正则表达式'
]
全局规则定义
比如有这样一个情况,我们定义的路由映射如下:
<?php
use think\Route;
Route::get('message', 'index/message/list');
Route::get('message/add', 'index/message/add');
Route::post('message/add', 'index/message/create');
Route::get('message/:id/edit', 'index/message/edit');
Route::post('message/:id/edit', 'index/message/update');
Route::get('message/:id/delete', 'index/message/delete');
其中存在变量 id
的路由有三个,或许三个不算多,但是如果有几十个呢,我们不可能对于每个路由定义都使用相同的 id
变量规则约束,如果有一个全局的约束的话那就最好不过啦!幸运的是,thinkphp5
提供了这个功能 ^ - ^ :
<?php
use think\Route;
Route::pattern('id','\d+');
如果声明了这句话,下面的单条路由的 id
就不需要手动的指定整数规则啦,只要存在变量 id
的路由都会检测这个 pattern
,是不是很方便?
当然也可传入数组批量注册:
<?php
use think\Route;
Route::pattern([
'name' => '\w+',
'id' => '\d+',
]);
路由参数
路由参数很使用也非常简单,比如说我们要限制 login
必须通过 https
访问,那么我们可以这样定义:
Route::post('login', 'index/auth/login', ['https' => true]);
是不是很简单? ^ - ^ . thinkphp5
为我们提供了许多内置的规则,具体如下(这里只给出了较为常用的几个):
参数 | 说明 | 取值 |
---|---|---|
ext |
URL 后缀检测 |
html | html|shtml
|
callback |
自定义检测方法 | 闭包 |
ajax |
ajax请求检测 |
true | false
|
自定义检测方法举例
<?php
use think\Route;
Route::get('login', 'index/auth/login', ['callback' => function () {
$request = request();
if ('1.2.3.4' != $request->ip()) {
exit('fobiddan.');
}
}]);
这里呢,我们限制了 login
这个地址必须是 ip
地址为 1.2.3.4
的用户才可以访问。
好了今天的教程就到这里啦。此篇是小滕的《Thinkphp5入门系列课程》第九课:路由(二)。
喜欢的给个订阅呗!
由于作者水平有限,如有错误请欢迎指正。
网友评论