Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。
迁移压缩
在你开发应用的过程中,随着时间的推移,你的迁移文件可能会累积的越来越多,这可能导致你的迁移目录变得非常臃肿。现在你可以把你的迁移文件压缩成一个 SQL 文件。执行 schema:dump 即可:
php artisan schema:dump // 转储当前数据库模式并删除所有现有的迁移… php artisan schema:dump --prune
执行完这条命令,Laravel 将会在 database/schema 目录写入一个「schema」文件。当在未执行任何其他迁移的情况下,你迁移数据库时,Laravel 将会先执行 schema 文件中的 SQL,再执行不包含在 schema 中的剩余迁移。
任务批处理
Laravel 的任务批处理特性让你可以简单地执行批量任务,然后在批量任务执行完成后再执行一些操作。 Bus facade 中新增了一个 batch 方法可以用来执行批量任务。当然,批处理主要是和回调结合使用的。所以,你可能需要使用 then,catch,finally 方法来定义完整的回调。这三种回调任意一个被调用时都会接收到一个 Illuminate\Bus\Batch 实例:
use App\Jobs\ProcessPodcast; use App\Podcast; use Illuminate\Bus\Batch; use Illuminate\Support\Facades\Batch; use Throwable; $batch = Bus::batch([ new ProcessPodcast(Podcast::find(1)), new ProcessPodcast(Podcast::find(2)), new ProcessPodcast(Podcast::find(3)), new ProcessPodcast(Podcast::find(4)), new ProcessPodcast(Podcast::find(5)), ])->then(function (Batch $batch) { // All jobs completed successfully... })->catch(function (Batch $batch, Throwable $e) { // First batch job failure detected... })->finally(function (Batch $batch) { // The batch has finished executing... })->dispatch(); return $batch->id;
速率限制优化
Laravel 的请求速率限制器得到了增强,具有更大的灵活性和功能,同时兼容上一个版本的 throttle 中间件。 使用 RateLimiter facade 的 for 方法来定义一个速率限制器。for 方法第一个参数是速率限制器名称,第二个参数是一个闭包函数,该闭包函数返回速率限制器的配置。
use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Support\Facades\RateLimiter; RateLimiter::for('global', function (Request $request) { return Limit::perMinute(1000); });
因为速率限制器的回调函数传入的是一个 HTTP 请求实例,你可以基于请求或当前认证的用户来动态设置速率限制。
RateLimiter::for('uploads', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100); });
有时你可能希望根据一些特定的值来进行速率限制。比如你希望限制用户每分钟内每个 IP 地址最多发起 100 次请求,你可以使用 by 方法来实现这一功能:
RateLimiter::for('uploads', function (Request $request) { return $request->user()->vipCustomer() ? Limit::none() : Limit::perMinute(100)->by($request->ip()); });
使用 throttle 中间件 将刚刚创建的速率限制器绑定到路由或者路由组就可以了。将速率限制器的名称传入中间件来进行绑定:
Route::middleware(['throttle:uploads'])->group(function () { Route::post('/audio', function () { // }); Route::post('/video', function () { // }); });