Laravel 8 正式发布,一起来看看有哪些新特性吧
Laravel 8 已于昨天正式发布(非 LTS 版本),本次主版本发布引入了 Laravel Jetstream、模型类目录、模型工厂类、迁移文件压缩、频率限制优化、时间测试辅助函数、动态 Blade 组件等新特性。
注:有同学反馈为什么 Laravel 版本发布这么频繁,那是因为从 Laravel 6 开始引入了新的版本发布周期,具体可参考学院君之前发布的这篇教程:Laravel 6 之后新版本的发布周期介绍。
下面我们一起来速览下这些新特性:
Laravel Jetstream
Laravel Jetstream 是在之前版本上进行优化和全新设计的 Laravel UI 脚手架代码:
其中包含了登录、注册、邮箱验证、双因子认证(2FA)、会话管理、基于 Laravel Sanctum 的 API 支持、以及可选的团队管理等功能。
Jetstream 使用的 CSS 框架是 Tailwind CSS,并且提供了 Livewire 和 Inertia 脚手架选项,你可以任选其一进行前端组件开发。
模型类目录
Laravel 8 终于在 app
目录下引入了 Models
子目录来存放模型类文件,所有通过 make:model
命令生成的模型类以后默认都会存放在这个目录下;不过,如果你选择删除这个目录,新生成的模型类将仍然存放到 app
目录下。
模型工厂类
从 Laravel 8 开始,Eloquent 模型工厂将基于类进行管理,从而支持不同工厂之间的关联关系,新的模型工厂调用语法如下所示,相比之前可读性更好:
use AppModelsUser;
User::factory()->count(50)->create();
// 使用工厂类中定义的 "suspended" 关联方法
User::factory()->count(5)->suspended()->create();
迁移文件压缩
随着应用功能越来越复杂,需要创建越来越多的数据库迁移文件,可能多至上百个,管理起来有点麻烦,从 Laravel 8 开始,你可以将它们压缩到单个 SQL 文件中,该 SQL 文件会在运行迁移命令之前执行,然后再执行其他未压缩的迁移文件。该功能可以有效降低迁移文件的数量,并且在测试时提升性能。
优化访问频率
Laravel 8 优化了之前已经存在的访问频率限制功能 —— 支持向后兼容 throttle
中间件,并且提供了更高的灵活性。Laravel 8 引入了一个可以通过门面定义的访问频率限制器:
use IlluminateCacheRateLimitingLimit;
use IlluminateSupportFacadesRateLimiter;
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
正如你所看到的,for
方法中持有 HTTP 请求示例,因此你可以完全动态控制请求频率。
时间测试辅助函数
在 Laravel 中,一直都可以通过 PHP Carbon 库完全控制时间的修改,Laravel 8 则在此基础上往前更进一步 —— 在测试时使用一个更加方便的辅助函数来操作时间:
// 穿越到未来...
$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();
使用这些方法时,时间会在每个测试之间重置。
动态 Blade 组件
有时候你可能需要在运行时动态渲染 Blade 组件,Laravel 8 提供了一个 <x-dynamic-component/>
组件来实现这个功能:
<x-dynamic-component :component="$componentName" class="mt-4" />
更多新特性
以上只是从 Laravel 8 中提取的一些比较重要的新特性进行介绍,完整的新特性列表可以参考官方的版本发布日志和升级指南。
- gsoap开发webservice
- [Go 语言社区]测试模块之---utf8例子
- org.hibernate.type.StringType cannot be cast to org.hibernate.type.VersionType
- JBPM4.4(2)-state结点和decision结点
- [Go 语言社区] Golang架构底层---日志函数
- [Go 语言社区]服务器游戏用户登陆数据读取函数
- 设计Go API的管道使用原则
- Goroutine背后的系统知识
- 从零到 Go:Google感恩节火鸡涂鸦开发纪实
- JBPM4.4(1)-简单工程的搭建
- 未绑定元素“mx:Panel”的前缀“mx”
- [Go 语言社区] Golang架构底层函数图片保存-原创
- [Go 语言社区]Golang架构--服务器与客户端自定义传输规则--原创
- Go语言 -浮点数
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- C# dotnet 使用 AsyncEx 库的 AsyncLock 异步锁
- bt5.9手动开心
- 项目中多个文件引入同一份公共样式less文件导致编译打包后有多份样式
- Angular rxjs Observable的异步行为
- Angular rxjs里自定义operator的使用
- tensorflow 生成指定大小的赋值0的张量 np.zeros 在TF中对应的语句 生成全0张量
- Angular rxjs fromEvent使用的一个例子
- 在StackBlitz上setup SAP Spartacus
- [898]python获取两个list交集|并集|差集
- [897]使用Maxwell实时同步mysql数据
- Magicodes.IE之导入导出筛选器
- 一文搞懂Flink生成StreamGraph
- 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一
- ESP8266和ROS调试一些问题汇总
- tianbot_mini机器人上手ROS/SLAM/Navigation究竟有多简单???