新版特性


Laravel 5.6 在 Laravel 5.5 的基础上继续进行优化,包括日志系统、单机任务调度、模型序列化优化、动态频率限制、广播频道类、API 资源控制器生成、Eloquent 日期格式化优化、Blade 组件别名、Argon2 密码哈希支持、引入 Collision 扩展包等等等等。此外,所有的前端脚手架代码都已升级到 Bootstrap 4,Laravel 底层使用的 Symfony 组件都已升级到 Symfony ~4.0 版本。

Laravel 5.6 版本的发布恰逢 Spark 6.0 的发布,所以这也是自 Laravel Spark 发布以来第一次重大版本升级。Spark 6.0 为 Stripe 和 Braintree 引入了按座定价功能,以及本地化、Bootstrap 4、增强 UI 和 Stripe Elements 支持。

注:本文档只是概述了框架大部分引人注目的重要升级,要了解详细升级日志可以查看 GitHub 上到 change logs

日志优化

Laravel 5.6 带来了日志系统的重大升级,所有日志配置都存放在新的 config/logging.php 配置文件,你现在可以轻松构建发送日志消息到多个处理器的日志"堆栈"。例如,你可以发送所有 debug 级别消息到系统日志同时发送 error 级别消息到 Slack 以便团队成员可以快速响应:

'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => ['syslog', 'slack'],
    ],
],

此外,现在可以使用日志系统的新"tap"功能很轻松地自定义已存在的日志频道。想要了解更多细节,请查看完整日志文档

单机任务调度

注:要使用这个新特性,必须使用 memcachedredis 缓存驱动作为应用默认缓存驱动。此外,所有服务器必须和同一个中心缓存服务器进行通信。

如果你的应用运行在多个服务器上,现在可以限定只在一台机器上运行调度任务。例如,假设你有一个在每周五晚上生成新报告的调度任务,如果任务调度器运行在三个服务器上,这个调度任务就会在三台机器上运行并生成同样的报告三次,这样很不优雅,甚至很糟糕!

要指定任务只在一台机器上运行,可以在定义调度任务时使用 onOneServer 方法,第一台获取到任务的机器会给这个任务上一把原子级别的锁来阻止其他服务器同时运行同一个任务:

$schedule->command('report:generate')
                ->fridays()
                ->at('17:00')
                ->onOneServer();

动态频率限制

当我们在之前版本的路由群组中指定了频率限制后,必须要硬编码最大请求次数:

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

在 Laravel 5.6 中,你可以基于认证用户模型属性指定一个动态的最大请求次数,如果 User 模型包含 rate_limit 属性,可以将属性名传递给 throttle 中间件,以便用于计算最大请求次数计数:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

广播频道类

如果你的应用消费多个不同的频道,routes/channels.php 文件可能会变得很臃肿,所以,作为使用闭包来授权频道的替代方案,你现在可以使用频道类。要生成一个频道类,可以使用 Artisan 命令 make:channel。该命令会将新生成的频道类存放到 app/Broadcasting 目录下:

php artisan make:channel OrderChannel

接下来,在 routes/channels.php 文件中注册这个频道类:

use App\Broadcasting\OrderChannel;

Broadcast::channel('order.{order}', OrderChannel::class);

最后,可以将频道的授权逻辑放到频道类的 join 方法。join 方法中的代码等同于之前位于频道授权闭包中的处理逻辑。当然,你还可以使用频道模型绑定:

<?php

namespace App\Broadcasting;

use App\User;
use App\Order;

class OrderChannel
{
    /**
     * Create a new channel instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Authenticate the user's access to the channel.
     *
     * @param  \App\User  $user
     * @param  \App\Order  $order
     * @return array|bool
     */
    public function join(User $user, Order $order)
    {
        return $user->id === $order->user_id;
    }
}

API 控制器生成

声明被 API 消费的资源控制器时,通常你会排除输出 HTML 模板的路由,例如 createedit,要生成不包含这些方法的资源控制器,可以在使用 Artisan 命令执行 make:controller 时使用 --api 开关:

php artisan make:controller API/PhotoController --api

模型序列化优化

在之前版本的 Laravel 中,队列中的模型在反序列化后不会带有完整的已加载关联关系。在 Laravel 5.6 中,模型上已加载的关联关系在队列任务被处理时会自动进行重新加载。

Eloquent 日期转化

现在你可以单独自定义 Eloquent 日期字段转化格式了,开始之前,需要在转化声明中指定目标日期格式。指定好之后,该格式就会在模型序列化为数组/JSON时使用:

protected $casts = [
    'birthday' => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];

Blade 组件别名

如果你的 Blade 组件存放在子目录中,现在起可以为它们起个别名以便使用。例如,假设一个 Blade 组件存放在 resources/views/components/alert.blade.php,你可以使用 component 方法将这个组件名从 components.alert 改为别名 alert

Blade::component('components.alert', 'alert');

组件起了别名之后,就可以使用别名来渲染:

@component('alert')
    You are not allowed to access this resource!
@endcomponent

或者,如果组件没有额外插槽,可以使用组件别名作为 Blade 指令:

@alert
    You are not allowed to access this resource!
@endalert

Argon2 密码哈希

如果你在构建一个基于 PHP 7.2.0+ 的应用,Laravel 现在可以支持通过 Argon2 算法进行密码哈希,默认的应用哈希驱动通过新增的 config/hashing.php 配置文件来控制。

UUID 方法

Laravel 5.6 引入了两个新的方法来生成 UUID:Str::uuidStr::orderedUuidorderedUuid 方法会生成一个时间戳最靠前的UUID,通过诸如 MySQL 的数据库来索引,更简单,也更高效。两个方法都会返回 Ramsey\Uuid\Uuid 对象:

use Illuminate\Support\Str;
return (string) Str::uuid();
return (string) Str::orderedUuid();

Collision

默认的 laravel/laravel 应用现在为 Collision 包含了一个 dev Composer 依赖,这个扩展包在通过命令行与 Laravel 应用交互时提供了美观的错误报告:

Bootstrap 4

所有前端脚手架例如用户登录认证模板和 Vue 示例组件都已经升级到 Bootstrap 4。默认情况下,生成的分页链接现在也已升级到 Bootstrap 4。


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

<< 上一篇: 目录索引

>> 下一篇: 升级指南