发行说明

版本控制方案

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 ,以便让团队成员更快速的对系统的错误做出反应:

  1. 'channels' => [
  2. 'stack' => [
  3. 'driver' => 'stack',
  4. 'channels' => ['syslog', 'slack'],
  5. ],
  6. ],

此外,使用日志系统的新「tap」功能,现在能更容易的自定义已存在的日志频道,更多详情可以查看 完整的日志系统文档.

单机任务调度

{note} 要使用这个新特性,必须使用memcachedredis 缓存驱动作为你应用程序的默认缓存驱动。另外,所有的服务器必须与同一个中心缓存服务器通信。

如果你的应用程序运行在多个服务器上,现在你可以限定只在一台机器上运行计划任务。 例如,假设你有一个每周五晚上生成新报告的计划任务。如果计划任务是运行在三个服务器上,这个计划任务就会运行在三个服务器上并生成同样的报告三次,这样非常糟糕!

为了让计划任务只运行在一个服务器上,可以在定义计划任务时使用 onOneServer 方法。 第一个服务器获得任务将会给任务添加一个原子锁,阻止其他的服务器在相同的计划周期运行同样的计划任务:

  1. $schedule->command('report:generate')
  2. ->fridays()
  3. ->at('17:00')
  4. ->onOneServer();

动态频率限制

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

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

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

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

广播频道类

如果你的应用正在消费多个频道,那么你的 routes/channels.php 将会越来越臃肿。所以你可以使用频道类代替闭包来授权频道。可以使用 make:channel Artisan 命令来创建频道类。这个命令会将新创建的类放到 App/Broadcasting 目录中。

  1. php artisan make:channel OrderChannel

然后在 routes/channels.php 中注册你的频道:

  1. use App\Broadcasting\OrderChannel;
  2. Broadcast::channel('order.{order}', OrderChannel::class);

最后,你可以在你的频道类 join 方法中写授权逻辑。join 方法的逻辑与你之前在频道授权闭包中的逻辑是一样的。当然,同时你可以利用频道模型绑定这种便利的功能:

  1. <?php
  2. namespace App\Broadcasting;
  3. use App\User;
  4. use App\Order;
  5. class OrderChannel
  6. {
  7. /**
  8. * 创建一个频道实例
  9. *
  10. * @return void
  11. */
  12. public function __construct()
  13. {
  14. //
  15. }
  16. /**
  17. * 授权用户在频道上的操作。
  18. *
  19. * @param \App\User $user
  20. * @param \App\Order $order
  21. * @return array|bool
  22. */
  23. public function join(User $user, Order $order)
  24. {
  25. return $user->id === $order->user_id;
  26. }
  27. }

生成 API 控制器

当你想为 API 生成控制器时,你会希望生成的控制器类里不包含 createedit 方法,因为他们在资源控制器的定义里,是返回 HTML 内容的。在 Laravel 新版本里,你只需要在执行 make:controller 时指定参数 —api 即可移除这两个方法:

  1. php artisan make:controller API/PhotoController --api

Model 模型序列化增强

在之前的版本中,当在队列中使用模型数据时,模型关联的数据是不会被直接加载的。在 Laravel 5.6 里,只要你请求队列时提前加载了模型关联数据,在队列执行时,这些关联数据会被自动加载。

Eloquent 日期格式指定

现在你可以为 Eloquent 的日期字段指定专属的 日期格式 了。字段指定日期格式以后,序列号 / JSON 都会返回格式化后的数据:

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

Blade 组件别名

如果你的 Blade 组件存储在子目录中,现在可以给它们起一个别名以方便访问。例如,想象存储在 resources/views/components/alert.blade.php 目录下的Blade 组件, 你可以使用 component 方法将 components.alert 组件别名为 alert

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

一旦组件被别名,你可以使用一个指令来渲染它:

  1. @alert('alert', ['type' => 'danger'])
  2. You are not allowed to access this resource!
  3. @endalert

如果没有附加插槽,您可以省略组件参数:

  1. @alert
  2. You are not allowed to access this resource!
  3. @endalert

Argon2 密码散列

如果您正在 PHP 7.2.0 或更高版本上构建应用程序,Laravel 现在通过Argon2 算法支持密码哈希。 应用程序的默认散列驱动程序由一个新的config/hashing.php 配置文件控制。

UUID 方法

Laravel 5.6 引入了两种用于生成 UUID 的新方法:Str::uuidStr::orderedUuidorderedUuid 方法将生成一个时间戳的第一个 UUID,它可以通过 MySQL 等数据库更容易和有效地索引。 每个方法都会返回一个 Ramsey\Uuid\Uuid 对象 :

  1. use Illuminate\Support\Str;
  2. return (string) Str::uuid();
  3. return (string) Str::orderedUuid();

Collision

现在,默认的 laravel/laravel 应用包含了由 Nuno Maduro 维护的 Collisiondev Composer 第三方依赖包,当我们在命令行中与 Laravel 应用进行交互时,它会提供美观的错误报告信息:

example.png

Bootstrap 4

所有的前端脚手架,例如身份验证样板文件和示例 Vue 组件都已经升级到了Bootstrap 4。默认情况下,分页链接生成的样式也默认采用了 Bootstrap 4。

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。