新特性概览
声明:Laravel 8 于 2020 年 9 月 8 日正式发布,不是 LTS 版本,所以 bug 修复支持会持续半年,到 2021 年 3 月 8 日,也就是下一个主版本 Laravel 9 发布前后,安全修复则会持续一年,到 2021 年 9 月 8 日。
Laravel 8 在 Laravel 7.x 版本基础上继续进行优化,主要包含了以下更新:
- Laravel Jetstream
- 模型工厂类
- 迁移文件压缩
- 任务批处理
- 访问频率限制优化
- 队列功能优化
- 动态 Blade 组件
- Tailwind 分页视图
- 时间相关的测试辅助函数
artisan serve
命令优化- 事件监听器优化
- 其他 bug 修复和可用性优化
其中比较重要的改进就是Laravel jetstream和模型工厂类
Laravel Jetstream
作者:Taylor Otwell。
Laravel Jetstream 是一个经过精美设计的 Laravel UI 脚手架,为你的下一个项目提供了非常好的起点,包含了登录、注册、邮箱验证、双因子认证(2FA)、会话管理、基于 Laravel Sanctum 的 API 支持以及可选的团队管理功能。
![f5de7bbf5da75a59c4d655bfc80ba754.png](https://img-blog.csdnimg.cn/img_convert/f5de7bbf5da75a59c4d655bfc80ba754.png)
Laravel Jetstream 是在之前版本的 UI 脚手架基础上进行的裁剪和优化,使用了 Tailwind CSS 框架,在 JavaScript 组件开发上,你可以按照自己的喜好选择 Livewire 或者 Inertia。
模型工厂类
作者:Taylor Otwell。
Eloquent 模型工厂被重构为基于类进行管理,并且被优化为直接支持关联关系,例如,Laravel 内置的 UserFactory
现在的示例代码如下:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
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:
<?php
namespace AppModels;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
...
因此,可以这样调用模型工厂:
use AppModelsUser;
User::factory()->count(50)->create();
由于模型工厂现在是简单的 PHP 类,因此状态转换可以通过类方法的方式实现。此外,你还可以按照需要添加任意其它的辅助类到 Eloquent 模型工厂。
例如,User
模型可能有一个 suspended
状态用于修改某个默认属性值(状态方法名可以随便取),你可以使用工厂基类提供的 state
方法来定义状态转换,最后呈现出来的就是一个典型的 PHP 方法:
/**
* Indicate that the user is suspended.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
public function suspended()
{
return $this->state([
'account_status' => 'suspended',
]);
}
定义好状态转换方法后,我们可以这样使用它
use AppModelsUser;
User::factory()->count(5)->suspended()->create();
正如前面所提到的,Laravel 8 的模型工厂包含对关联关系的一等支持,所以,假设User
模型包含posts
关联方法,我们可以简单运行如下代码来生成一个拥有三篇文章的用户:
$users = User::factory()
->hasPosts(3, [
'published' => false,
])
->create();
为了简化升级流程, Laravel 官方还专门发布了 laravel/legacy-factories 包用于在 Laravel 8.x 中兼容之前版本的模型工厂。
Laravel 对模型工厂的重构还包含了很多你可能会喜欢的其它新特性,更多细节,请参考数据库测试文档。