新版特性


Laravel 5.7 在 Laravel 5.6 的基础上继续进行优化,包括引入 Laravel Nova,认证脚手架中可选的邮箱验证,支持针对未登录用户的授权,集成 Symfony dump-server,本地化通知,以及多个 bug 修复和可用性的提升。

Laravel Nova

Laravel Nova 是一个专门为 Laravel 应用打造的、美观的、一流的后台管理面板,当然,Nova 的核心功能还是通过 Eloquent 管理底层数据库记录,不过在这个核心功能之上,Nova 还支持过滤器、透镜、动作、动作队列、授权、自定义工具、自定义卡片、自定义字段等额外功能。

要了解更多关于 Laravel Nova 的内容,请参考 Nova 官网

邮箱验证

Laravel 5.7 为 Laravel 框架自带的认证脚手架代码引入了邮箱验证功能,为了实现这个功能,框架自带的 users 表迁移还新增了一个时间戳字段 email_verified_at

如果想提示新注册用户验证他们的邮箱,User 模型类需要实现 MustVerifyEmail 接口:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

一旦 User 模型类标记实现 MustVerifyEmail 接口,新注册的用户将会收到一封邮件,其中包含已签名的验证链接,点击这个链接,Laravel 将会自动在数据库中记录验证时间并将用户重定向到你设置的页面。

此外,默认 HTTP kernel 中还新增了一个 verified 中间件,用于过滤那些未验证邮箱的用户:

'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

注:要了解更多关于邮箱验证的实现细节,请参考完整文档

未登录用户授权

在之前版本的 Laravel 中,对于未登录访客的权限判断,无论是 Gate 还是 Policy,都会自动返回 false。不过,在 Laravel 5.7 中,你可以通过声明一个可选的类型提示或者将用户参数定义默认设置为 null,以便访客可以通过授权检查:

Gate::define('update-post', function (?User $user, Post $post) {
    // ...
});

Symfony Dump Server

Laravel 5.7 通过引入扩展包 Laravel Dump Server 在 Laravel 应用中集成了 Symfony 的 dump-server 命令。只需通过运行如下 Artisan 命令就可以启用:

php artisan dump-server

一旦服务器启动,所有对 dump 函数的调用结果将会输出到 dump-server 控制台窗口,而不是显示在浏览器中,从而允许开发者在不打乱 HTTP 响应输出的情况下检查某些值。

通知本地化

Laravel 5.7 允许开发者通过本地化语言发送通知,甚至能够在通知队列中记住本地化设置。

为了实现这个功能,Illuminate\Notifications\Notification 类新增了一个 locale 方法来设置期望语言,应用会在通知被格式化时切换到 locale 设置语言,并在格式化完成后切换回之前的语言:

$user->notify((new InvoicePaid($invoice))->locale('es'));

还可以通过 Notification 门面来本地话多个通知实体:

Notification::locale('es')->send($users, new InvoicePaid($invoice));

URL 生成器 & 可调用语法

除了只接收字符串外,Laravel 的 URL 生成器现在还可以在生成指向控制器动作的URL时接收「可调用」语法:

action([UserController::class, 'index']);

分页器链接

Laravel 5.7 允许开发者控制在每个分页器 URL 窗口中主分页(当前页码)左右各显示多少个额外的链接,默认情况下,在主分页器链接左右各显示三个链接,不过,你可以通过使用 onEachSide 方法里控制这个数值:

{{ $paginator->onEachSide(5)->links() }}

文件系统读写流

Laravel 的文件系统现在集成了 readStreamwriteStream 方法:

Storage::disk('s3')->writeStream(
    'remote-file.zip',
    Storage::disk('local')->readStream('local-file.zip')
);

点赞 取消点赞 收藏 取消收藏

<< 上一篇: 目录索引

>> 下一篇: 升级指南