发行说明
发行说明
版本控制方案
Laravel 的版本控制方案使用以下约定:主版本号.次版本号.修订号
。次版本号框架每六个月(二月和八月)发布,而修订号版本可能每周发布一次,而修订号版本不包含重大更改。
你从应用程序中或在包中引用 Laravel 框架或其他组件时,应该始终使用版本约束,例如 5.5.*
,因为 Laravel 的次要版本包含重大更改。但是,我们会努力确保你可以在一天或更短时间内完成更新。
主版本之间的发布往往需要很多年,每次发布代表框架架构和底层结构发生了根本的改变。而目前并没有准备开发主版本号的计划。
支持策略
对于 LTS 版本,例如 Laravel 5.1,提供两年的错误修复和三年的安全修复。这些版本提供最长时间的支持和维护。对于一般版本,则只是提供六个月的错误修复和为期一年的安全修复。
Laravel 5.6
Laravel 5.6 继续在 Laravel 5.5 的基础上进行持续改进,改进有添加了一个改良的日志系统,单机任务调度系统,对模型序列化进行改进,动态的速率限制,广播频道类添加,可生成 API 资源控制器,Eloquent 日期格式改进,Blade 组件别名,Argon2 密码哈希支持,加入 Collision 包,以及更多。除此之外全部前端脚手架已经升级为 Bootstrap 4。
所有 Laravel 使用的 Symfony 组件已经升级到 Symfony ~4.0
release 系列。
此次发布 Laravel 5.6 的同时也发布了 Spark 6.0,这是 Laravel Spark 的一次重大升级,Spark 6.0 为 Stripe 和 Braintree 引入了按座定价功能,以及本地化、Bootstrap 4、增强 UI 和 Stripe Elements 支持。
{tip} 这个文档总结了那些对框架来说最显著和值得注意的改进;更加详尽的改进可以查阅 on GitHub.
Logging 改进
Laravel 5.6 对日志系统做出了巨大的改进,所有日志的配置都放置在一个新的 config/logging.php
配置文件中,你可以轻松的构建日志「栈」然后发送日志消息到多个处理器,例如,你可以发送所有的 debug
级别的日志消息到系统日志,同时将 error
级别的日志消息发送到 Slack ,以便让团队成员更快速的对系统的错误做出反应:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['syslog', 'slack'],
],
],
此外,使用日志系统的新「tap」功能,现在能更容易的自定义已存在的日志频道,更多详情可以查看 完整的日志系统文档.
单机任务调度
{note} 要使用这个新特性,必须使用
memcached
或redis
缓存驱动作为你应用程序的默认缓存驱动。另外,所有的服务器必须与同一个中心缓存服务器通信。
如果你的应用程序运行在多个服务器上,现在你可以限定只在一台机器上运行计划任务。 例如,假设你有一个每周五晚上生成新报告的计划任务。如果计划任务是运行在三个服务器上,这个计划任务就会运行在三个服务器上并生成同样的报告三次,这样非常糟糕!
为了让计划任务只运行在一个服务器上,可以在定义计划任务时使用 onOneServer
方法。 第一个服务器获得任务将会给任务添加一个原子锁,阻止其他的服务器在相同的计划周期运行同样的计划任务:
$schedule->command('report:generate')
->fridays()
->at('17:00')
->onOneServer();
动态频率限制
在之前的 Laravel 版本的路由群组中指定 频率限制 后,必须要硬编码最大请求次数:
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
在 Laravel 5.6 中,你可以基于认证 User
模型属性指定一个动态的最大请求次数。例如,如果你的 User
模型包含 rate_limit
属性,可以将属性名传递给 throttle
中间件,以便用于计算最大请求次数计数:
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});
广播频道类
如果你的应用正在消费多个频道,那么你的 routes/channels.php
将会越来越臃肿。所以你可以使用频道类代替闭包来授权频道。可以使用 make:channel
Artisan 命令来创建频道类。这个命令会将新创建的类放到 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
{
/**
* 创建一个频道实例
*
* @return void
*/
public function __construct()
{
//
}
/**
* 授权用户在频道上的操作。
*
* @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 生成控制器时,你会希望生成的控制器类里不包含 create
和 edit
方法,因为他们在资源控制器的定义里,是返回 HTML 内容的。在 Laravel 新版本里,你只需要在执行 make:controller
时指定参数 --api
即可移除这两个方法:
php artisan make:controller API/PhotoController --api
Model 模型序列化增强
在之前的版本中,当在队列中使用模型数据时,模型关联的数据是不会被直接加载的。在 Laravel 5.6 里,只要你请求队列时提前加载了模型关联数据,在队列执行时,这些关联数据会被自动加载。
Eloquent 日期格式指定
现在你可以为 Eloquent 的日期字段指定专属的 日期格式 了。字段指定日期格式以后,序列号 / JSON 都会返回格式化后的数据:
protected $casts = [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
];
Blade 组件别名
如果你的 Blade 组件存储在子目录中,现在可以给它们起一个别名以方便访问。例如,想象存储在 resources/views/components/alert.blade.php
目录下的Blade 组件, 你可以使用 component
方法将 components.alert
组件别名为 alert
:
Blade::component('components.alert', 'alert');
一旦组件被别名,你可以使用一个指令来渲染它:
@alert('alert', ['type' => 'danger'])
You are not allowed to access this resource!
@endalert
如果没有附加插槽,您可以省略组件参数:
@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::uuid
和 Str::orderedUuid
。 orderedUuid
方法将生成一个时间戳的第一个 UUID,它可以通过 MySQL 等数据库更容易和有效地索引。 每个方法都会返回一个 Ramsey\Uuid\Uuid
对象 :
use Illuminate\Support\Str;
return (string) Str::uuid();
return (string) Str::orderedUuid();
Collision
现在,默认的 laravel/laravel
应用包含了由 Nuno Maduro 维护的 Collision 的 dev
Composer 第三方依赖包,当我们在命令行中与 Laravel 应用进行交互时,它会提供美观的错误报告信息:
Bootstrap 4
所有的前端脚手架,例如身份验证样板文件和示例 Vue 组件都已经升级到了
Bootstrap 4。默认情况下,分页链接生成的样式也默认采用了 Bootstrap 4。