MENU

# 03: 路由进阶:模型绑定、回退路由、频率限制

January 14, 2020 • Laravel 入门

模型绑定

想要获取指定 ID 的文章信息,一般会想到使用路由参数或 GET 参数进行传参然后再查找数据:

Route::get('/post/{id}', function ($id) {
   $post = App\Post::findOrFail($id);
    // ...
});

Laravel 的路由提供了更优雅的方法获取数据,它可以将 ID 对应的模型实例自动注入到回调方法中,模型绑定分为隐式绑定和显式绑定,具体看例子吧。

隐式绑定

隐式绑定是最方便的绑定方式,默认约定路由参数 post 对应 App\Post 模型,在回调方法中定义一个 App\Post 类型的形参 $post 即可完成绑定。

Route::get('/post/{post}', function (App\Post $post) {
    dd($post);
});

当访问 http://blog.test/post/1 时,路由解析器会自动将 ID = 1 的文章对象注入到回调方法的 $post 中,省去了自己查找数据的语句。当 ID = 1 的文章不存在时,会响应 404 错误。

默认是 Eloquent 通过 id 进行查找,也可以自定义字段,如文章的 slug,需要在 app/Post.php 中编写如下方法:

<?php
public function getRouteKeyName()
{
    return 'slug';
}

显式绑定

与隐式绑定的区别是,显示绑定需要在 app/Providers/RouteServiceProvider.php 中手动指定路由参数与模型的关联:

public function boot()
{
    parent::boot();
    Route::model('post_model', App\Post::class);
}

绑定后,就可以在路由中配置参数 post_model 了:

Route::get('/post/{post_model}', function (App\Post $post) {
    // ...
})

回退路由

对于未能匹配到路由的请求,Laravel 框架会返回一个默认的 404 页面。我们可以定义一个回退路由自行处理未匹配的请求,例如进行更友好的提示、统计数据等。回退路由需要放在 routes\web.php 最底部:

// ...
Route::fallback(function () {
    return '404';
});

频率限制

用于限制一个用户在指定时间内对某个路由的访问次数,这个功能对应用的安全性、可用性方面十分有用。频率限制功能通过 throttle 中间件实现,该中间件接收两个参数,第一个是次数上限,第二个是指定时间段(单位:分钟)。

Route::middleware('throttle:60,1')->get('/login', function () {
    return 'login page';
});

上述例子中,配置了 60 次/分钟 的频率限制,当 1 分钟内同一客户端访问该路由次数超过 60 次时将放回 429 状态码并提示请求次数过多。