Laravel 路由:路由参数约束
说明
有些时候我们需要对 URL 参数做限定,以节省系统资源,或者其他目的。例如以下的 URL 中:
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
方法。
可以在RouteServiceProvider
的boot
方法中定义你的参数:
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} 为数字时执行…
});
nice