Laravel 路由:路由参数约束 3 个改进

说明

有些时候我们需要对 URL 参数做限定,以节省系统资源,或者其他目的。例如以下的 URL 中:

http://example.com/users/1

users 后面跟着的是用户 ID,对应数据库中 ID 类型为自增整数。我们接受 URL 传参时候,可以限定为只通过数字类型的数据,类似以下 URL 都 不属于 我们的目标:

在以上的例子中,我们约束了参数的类型,当用户请求了类似以上两个 URL 的传参时直接就返回 404 错误,不会继续消耗系统资源,也使代码更加严谨。

正则表达式约束

可以直接在路由上使用where方法来约束路由参数的格式。where方法接收的参数为 参数的名称正则表达式

routes/web.php

Route::get('user/{name}', function ($name) {
    // 只允许一个以上大小写字母
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    // 只允许一个以上数字
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    // 同时限定两个参数
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

全局约束

如果希望某个字串对应的路由参数如 id 始终受给定正则表达式的约束,则可以使用pattern方法。

可以在RouteServiceProviderboot方法中定义你的参数:

app/Providers/RouteServiceProvider.php

/**
 * 定义路由模型绑定、路由全局约束等
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

一旦参数被定义,它将自动应用于所有使用该参数名称的路由:

routes/web.php

Route::get('user/{id}', function ($id) {
    // 仅当 {id} 为数字时执行…
});
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 1

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!