Laravel5.3~5.5版本特性整理
一、5.3
新特性概览
- 消息通知 Laravel Notifications;
- 事件广播 Laravel Echo;
- OAuth2 授权认证 Laravel Passport;
- 全文搜索引擎 Laravel Scout;
- Laravel Elixir 开始支持 Webpack;
- Mail 操作类 Laravel Mailable;
- web 和 api 的路由分离;
- 基于闭包的控制台命令;
- 更加易用的辅助函数,用于存储上传的文件;
- 支持 POPO 和单动作控制;
- 优化默认的前端脚手架,等等。
消息通知 Laravel Notifications
Laravel Notifications 提供了简单、优雅的 API 支持你通过不同的渠道发送通知,例如电子邮件、Slack、手机短信等等。
例如,你可以定义一个单据,当该单据被付款后,则通过邮件和手机短信发送提醒通知:
你可用通过下面这个简单的方法来实现:
$user->notify(new InvoicePaid($invoice));
参考文档:
WebSockets 事件广播 | Laravel Echo
- 广播系统:WebSocket 连接实现广播系统
- Laravel Echo:是一个可通过 NPM 安装的全新的 JavaScript 包
全文搜索引擎 Laravel Scout
Laravel Scout 是针对 Eloquent 模型 开发的基于驱动的全文检索系统。Scout 使用模型观察者时会自动保持你的检索索引与你的 Eloquent 记录同步。
- 基于DB监听实现的数据索引;旧框架无法监听
- 支持的驱动为第三方。可能收费
Laravel Passport (OAuth2 认证服务)
Laravel 5.3 的 Passport 让 API 认证变得简单。Laravel Passport 可以让你在几分钟内为应用程序创建一个完整的 OAuth2 认证服务,Passport 基于 Alex Bilbie 的 League OAuth2 server 实现。
Passport 让发放 OAuth2 令牌(Access Token)变得轻松,你还可以允许用户通过 Web 界面创建 个人访问令牌。
存储上传文件
Laravel 5.3 提供了一个便捷的 store 方法,只需要对上传文件对象调用此方法,并传参准备存储的路径即可:
/**
* 更新用户头像
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$path = $request->file('avatar')->store('avatars', 's3');
return $path;
}
其他
- 路由文件:拆分
web.php
和api.php
Artisan
支持闭包控制台命令
二、5.4
新特性概览
- 在邮件和通知中支持 Markdown;
- Laravel Dusk 浏览器自动测试框架;
- Laravel Mix;
- Blade “components” 和 “slots”;
- 在广播频道上进行路由模型绑定;
- 在集合中支持高阶消息传递;
- 基于对象的 Eloquent 事件;
- 任务级别的「重试」和「超时」设置;
- “实时” Facades;
- 更好的支持 Redis Cluster;
- 自定义 pivot 表模型;
- 两个新的中间件,用于输入修剪空格和清除非必要字段,等等。
Laravel Dusk
Laravel Dusk 提供一个优雅,简单易用的浏览器自动化测试 API。默认情况下,Dusk 不需要再你安装 JDK 或 Selenium 。Dusk 使用独立的 ChromeDriver 安装方式。你也可自由的使用其他 Selenium 兼容驱动。
Dusk 运行使用真实的浏览器,所有你可以轻松地对那些重度使用 JavaScript 的引用进行测试和交互
Laravel Mix
Laravel Mix 提供流式 API 定义 Webpack 构建步骤,有几种已经定义的 CSS 和 JavaScript 预处理器。通过简单的方法链,你可以流畅的定义你的资源构建流水线。例如:
mix.js('resources/assets/js/app.js', 'public/js')
.sass('resources/assets/sass/app.scss', 'public/css');
集合高阶消息传递
PS:使用方便
集合类文件:\vendor\laravel\framework\src\Illuminate\Support\Collection.php
集合现在支持 “高阶消息传递”,从而使集合的操作更为精简,目前支持高阶消息传递方法有:
contains
、each
、every
、filter
、first
、map
、partition
、reject
、sortBy
、sortByDesc
、sum
。
每一个高阶消息传递都可以通过集合实例的动态属性进行访问,例如,使用 each 的高阶消息传递去调用集合的某个对象:
$users = User::where('votes', '>', 500)->get();
$users->each->markAsVip();
任务级别重试和超时
5.4版本以前,任务队列 retry
和 timeout
设置只能在全局的队列配置中用命令行设置。现在可以单独在任务类中配置每一个任务的 “重试” 和 “超时”:
<?php
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
/**
* The number of times the job may be attempted.
*
* @var int
*/
public $tries = 5;
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 120;
}
优化Redis集群支持
5.4版本以前,在同一个应用中不能同时定义 Redis 链接指向单个主机和集群,在 Laravel 5.4 中可以在同一个应用中定义 Redis 链接指向多个主机和多个集群。
三、5.5
新特性概览
- Laravel Horizon
- 包自动发现
- API 资源/转换
- 控制台命令自动注册
- 队列任务链、队列任务速率限制、基于时间任务的尝试
- 可渲染的邮件
- 自定义异常报告、异常处理规范化
- 数据库测试改进
- 更简单自定义验证规则
- 前端预配置
Route::view
和Route::redirect
方法、- Memcached 和 Redis 缓存驱动程序的「锁定」
- 按需通知功能、Dusk 支持 Chrome 的 headless 模式
- 方便的 Blade 快捷键
- 改进可信代理支持等。
Laravel Horizon
Horizon 为你的 Laravel Redis 队列提供了一个漂亮的仪表版和代码驱动配置。Horizon 允许你轻松监控队列系统的关键指标,例如任务吞吐量、运行时间和失败任务。
所有的配置都存放一个简单的配置文件中,让你的整个团队可以协同工作。
包自动发现
在之前的 Laravel 版本中,安装包通常需要几个步骤,例如添加服务提供器到 app 配置文件并注册相关的 facades。现在,从 Laravel 5.5 开始,Laravel 可以自动检测并注册服务提供器和 facades。
例如,你可以通过 barryvdh/laravel-debugbar
安装这个包来体验一下。用 Composer 来安装之后,无需任何配置,就可以直接使用 debugbar:
composer require barryvdh/laravel-debugbar
包的开发者只需要将他们的服务提供器和门面添加到他们的包的 composer.json
文件中:
"extra": {
"laravel": {
"providers": [
"Laravel\\Tinker\\TinkerServiceProvider"
]
}
},
API 资源/转换
PS:类似我们现有的模型层里些格式化输出
构建 API 时,你可能需要一个位于 Eloquent 模型和实际返回给用户响应之间的 JSON 转换层。Laravel 的资源类允许你以轻松地方式将你的模型和模型集合转换为 JSON。而这个资源类代表了需要转换为 JSON 结构的单个模型。例如,这里是一个简单的用户资源类:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class User extends Resource
{
/**
* 将资源转换为数组。
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
}
队列任务链
任务链允许你指定按顺序运行的队列任务列表。如果队列中的一个任务失败,则其余任务便不会再运行。要执行队列的任务链,你可以在分配任务时使用 withChain
方法:
ProvisionServer::withChain([
new InstallNginx,
new InstallPhp
])->dispatch();
Queued 任务速率限制
如果你的应用程序与 Redis 进行交互,那你就可以根据时间或并发来调整排队的任务。当你队列的任务与限制速率的 API 进行交互时,这个功能就派上用场了。例如,你可以限制给定类型的任务只能每 60 秒运行 10 次:
Redis::throttle('key')->allow(10)->every(60)->then(function () {
// 任务逻辑...
}, function () {
// 无法获得锁...
return $this->release(10);
});
{tip} 在上面的示例中,key 是唯一可以标识要限制的任务类型的字符串。 例如,你可能会根据任务的类名和其运行的 Eloquent 模型的 ID 来构建这个 key。
或者,你也可以指定同时处理给定任务的最大工作进程数。当队列的任务正在修改一次只能由一个任务修改的资源时,我们可以将给定类型的任务限制为一次只能由一个工作进程处理:
Redis::funnel('key')->limit(1)->then(function () {
// 任务逻辑...
}, function () {
// 无法获得锁...
return $this->release(10);
});
缓存锁
Redis 和 Memcached 缓存驱动程序现在支持获取和释放原子「锁」。这提供了一种在不考虑竞争条件的情况下获取任意锁的简单方法。举个例子,在执行任务之前,你可能希望获得给定值的锁定,来确保没有其他进程在执行相同的任务:
if (Cache::lock('lock-name', 60)->get()) {
// 获得锁 60 秒,继续处理……
Cache::lock('lock-name')->release();
} else {
// 无法获得锁……
}
或者,你可以将给 get 方法传递一个闭包。在判断可以锁定给定值并且在执行闭包后自动释放锁定的情况下,闭包才会执行:
Cache::lock('lock-name', 60)->get(function () {
// 获得锁 60 秒
});
此外,你也可以直接对给定值进行 「阻塞」直到锁可用为止:
if (Cache::lock('lock-name', 60)->block(10)) {
// 等待最长10秒的时间,锁可用
}
四、参考
- https://laravel-china.org/docs/laravel/5.4/releases
- https://laravel-china.org/docs/laravel/5.5/releases