Laravel 8 正式发布!来看看有哪些新特性

Laravel 8 延续了 7 中的改进,包括 Laravel Jetstream,模型工厂类,迁移压缩,任务批处理,速率控制优化,队列优化,动态 Blade 组建,Tailwind 分页视图,时间测试助手,artisan serve 服务器优化,事件监听器优化,以及其他各种 BUG 修复和可用性改进。

Laravel Jetstream

Laravel Jetstream 来自于 Laravel 之父 Taylor Otwell。它是一个设计的非常漂亮的 Laravel 应用程序脚手架。Laravel Jetstream 为你搭建你的下一个项目提供了一个完美的起点,它包含了:登录,注册,邮箱验证,双因素认证,会话管理,基于 Laravel Sanctum 的 API 管理,可选的团队管理。Laravel Jetstream 替代并改进了之前版本的认证 UI 脚手架。

Laravel Jetstream 是使用 Tailwind CSS 设计的,并提供 Livewire 和 Inertia 脚手架供选择。

Models 目录

由于大量的社区需求,默认的 Laravel 框架现在包含一个 app/Models 目录,我们希望你喜欢这个为你的模型文件准备的新家。所有相关的生成器命令都已经更新,假定你的模型文件存放在 app/Models 目录,当然前提是存在这个目录。如果不存在这个目录,框架会假定你的模型文件存在于 app 目录下。

模型工厂类

模型工厂类由 Taylor Otwell 贡献。

Elequent 模型工厂已经被完全重写为基于类的工厂,并进行了改进,以完美支持模型关联。例如,包含在 Laravel 中的 UserFactory 是这样写的:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

因为生成的模型上提供了新的 HasFactory trait,模型工厂可以这样使用:

use App\Models\User;

User::factory()->count(50)->create();

因为模型工厂现在是简单的 PHP 类,状态转换可以写成类方法。除此之外,你也可以给你的Elequent 模型工厂添加任意你需要的工具类。

例如,你的 User 模型可能有个属性值需要修改为 suspended,你可以使用工厂的 state 方法来定义这个状态转移。你可以随意命名你的方法,毕竟这就是一个典型的 PHP 方法。

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

定制好状态转移方法后,我们就可以这么使用:

use App\Models\User;  

User::factory()->count(5)->suspended()->create(); 

像之前说到的,Laravel 8 的模型工厂包含了对模型关联的完美支持。现在假定我们的 User 模型有一个 Posts 关联方法,我们只需要执行下面的代码就可以生成一个有 3 篇文章的用户。

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

为了简化升级过程,我们发布了一个 laravel/legacy-factories 扩展包,可以在Laravel 8中支持以前的模型工厂。

重写版的模型工厂还包含了很多特性,我们相信你会喜欢的。想了解更多的话,请查看文档 learnku.com/docs/laravel/8.x/datab...

迁移压缩

迁移压缩由Taylor Otwell 贡献。

在你开发应用的过程中,随着时间的推移,你的迁移文件可能会累积的越来越多,导致你的迁移目录变得非常臃肿。现在,如果你愿意的话,你可以把你的迁移文件压缩成一个 SQL 文件。执行 schema:dump 即可:

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

执行完这条命令,Laravel 将会在你的 database/schema 目录写入一个 “schema” 文件。现在,当你执行数据库迁移时,Laravel 将会先执行 schema 文件中的 SQL,再执行不包含在 schema 中的剩余迁移。

任务批处理

任务批处理由 Taylor Otwell 和 Mohamed Said 共同贡献。

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) {

})->catch(function (Batch $batch, Throwable $e) {

})->finally(function (Batch $batch) {

})->dispatch();

return $batch->id;

想了解更多关于批处理,请访问文档 learnku.com/docs/laravel/8.x/queue...

速率限制优化

速率限制优化由 Taylor Otwell 贡献。

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);
});

有时你可能希望根据一些特定的值来进行速率限制。比如你希望限制i用户每分钟内每个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 () {

    });
});

想了解更多关于速率限制器,请查看文档:learnku.com/docs/laravel/8.x/routi...

维护模式优化

维护模式优化由 Taylor Otwell 贡献,灵感来源于 Spatie

在之前的 Laravel 版本中,php artisan down 开启的维护模式可以通过建立一个 IP 地址白名单来绕过,在白名单中的 IP 地址可以正常访问应用。在新版本中这个特性被移除了,取而代之的是一个简单的 token 方案。

在维护模式下,你可以通过 secret 选项生成一个可以绕过维护模式的 token:

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

将应用设置为维护模式后,你可以带上这个 token 访问应用程序的 URL,然后 Laravel 将会在浏览器中写入一个能绕过维护模式的 cookie:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

通过这个隐藏路由,你会被重定向到应用的 / 路由。一旦 cookie 被写入浏览器,你就可以像没开启维护模式一样正常的访问应用。

预渲染维护模式视图

如果你在部署期间使用了 php artisan down,你的用户又在更新 composer 依赖或其他基础视图时访问应用,可能偶尔还是会出错。出现这种情况是因为 Laravel 必须启动先启动一些核心的功能,来确定你的应用是否处于维护模式,然后用模板引擎渲染维护模式视图。

由于这个原因,Laravel 现在允许你在请求的生命周期的最开始预渲染一个维护模式视图。这个视图会在应用的任何依赖加载之前渲染。你可以使用 down 命令的 render 选项选择一个预渲染模板:

php artisan down --render="errors::503"

Closure Dispatch / Chain catch

Catch 优化由 Mohamed said 贡献。

使用新增的 catch 方法,你现在可以规定一个闭包函数来监听某个闭包队列。当闭包队列耗尽了队列配置的所有重置次数后还没有完全成功,就执行闭包函数:

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {

});

动态 Blade 组件

动态 Blade 组件由 Taylor Otwell 贡献。

有时你需要渲染一个组件,但是不确定在运行时应该渲染哪个组件。在这种情况下,你现在可以使用 Laravel 内置的 dynamic-component 组件去根据运行时的某个值或某个变量来动态渲染组件:

<x-dynamic-component :component="$componentName" class="mt-4" />

想了解更多关于 Blade 组件,请查看文档:learnku.com/docs/laravel/8.x/blade...

事件监听器优化

事件监听器优化由 Taylor Otwell 贡献

现在可以通过给 Event::listen 方法传入一个闭包函数来简单的注册一个基于闭包的事件监听器。Laravel 会检查闭包以确定监听器处理的事件类型。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {

});

除此之外,基于闭包的事件监听器现在可以使用 Illuminate\Events\queueable 方法标记为可队列化的:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {

}));

就像队列任务一样,你可以使用 onConnection,onQueue,和 delay 方法定制如何执行队列监听器:

Event::listen(queueable(function (PodcastProcessed $event) {

})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

如果你想对匿名队列监听器进行异常处理,你可以在定义 queueable 监听器时使用 catch 方法并传入一个闭包函数来实现:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (PodcastProcessed $event) {

})->catch(function (PodcastProcessed $event, Throwable $e) {

}));

时间测试工具

时间测试工具由 Taylor Otwell 贡献,灵感来自于 Ruby on Rails

在测试时,你可能偶尔需要修改now 或者 Illuminate\Support\Carbon::now() 返回的时间。Laravel 的基础测试类现在包含了一个可以操作时间的工具:

public function testTimeCanBeManipulated()
{
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    $this->travel(-5)->hours();

    $this->travelTo(now()->subHours(6));

    $this->travelBack();
}

Artisan serve 优化

Artisan serve 优化由 Taylor Otwell 贡献

现在,优化后的 Artisan serve 命令可以监听本地 .env 文件中的环境变量的修改,并自动重新加载。以前则必须手动重启。

Tailwind 分页视图

Laravel 的分页器现在默认使用 Tailwind CSS 框架。Tailwind CSS 是一个轻量级的,高度可定制的CSS 框架,它提供了构建一个定制化设计所需要的所有模块,并且没有烦人的不得不覆盖掉的样式。当然了,你仍然可以选择使用 Bootstrap 3 或 4。


以上就是 Laravel 8 带来的新特性简介!下面附上相关链接:

Laravel 8 正式发布:laravel-news.com/laravel8

Laravel 8 官方文档:《Laravel 8 中文文档》

Laravel 8 中文文档:《Laravel 8 中文文档》

我的博客:dmmylove.cn/articles/63

我的公众号:前端猫哥

本作品采用《CC 协议》,转载必须注明作者和本文链接
长路漫漫,唯键盘作伴。:octocat: 我是猫哥,欢迎关注我的 「个人博客 」和微信公众号「前端猫哥」 :new_moon_with_face:
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

不错不错 Taylor Otwell 贡献好多

3年前 评论
前端猫哥 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!