程序员PHP经验分享

《Thinkphp5入门系列课程》第九课:路由(二)

2017-09-13  本文已影响212人  6aec4f6b9d46

Thinkphp5视频教程

通过本文你可以学到:

回忆

上一篇文章中,在使用 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入门系列课程》第九课:路由(二)。
喜欢的给个订阅呗!
由于作者水平有限,如有错误请欢迎指正。

上一篇 下一篇

猜你喜欢

热点阅读