Laravel5.2+ 版本新特性

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.phpapi.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

集合现在支持 “高阶消息传递”,从而使集合的操作更为精简,目前支持高阶消息传递方法有:

containseacheveryfilterfirstmappartitionrejectsortBysortByDescsum

每一个高阶消息传递都可以通过集合实例的动态属性进行访问,例如,使用 each 的高阶消息传递去调用集合的某个对象:

$users = User::where('votes', '>', 500)->get();

$users->each->markAsVip();

任务级别重试和超时

5.4版本以前,任务队列 retrytimeout 设置只能在全局的队列配置中用命令行设置。现在可以单独在任务类中配置每一个任务的 “重试” 和 “超时”:

<?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::viewRoute::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
赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址