按這成為會員 登錄
比思論壇 返回首頁

xing797的個人空間 http://bbb-ccc.top/?2657108 [收藏] [複製] [分享] [RSS]

日誌

Laravel 新版特性

熱度 1已有 2980 次閱讀2018-8-23 10:11

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"功能很轻松地自定义已存在的日志频道。想要了解更多细节,请查看完整日志文档

单机任务调度

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

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

要指定任务只在一台机器上运行,可以在定义调度任务时使用 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 模板的路由,例如 create 和 edit,要生成不包含这些方法的资源控制器,可以在使用 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::uuid 和 Str::orderedUuid,orderedUuid 方法会生成一个时间戳最靠前的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。

發表評論 評論 (2 個評論)

回復 kane_29 2018-8-23 10:21
威武威武威武,厉害了
回復 xing797 2018-8-24 09:02
kane_29: 威武威武威武,厉害了
谢谢

facelist doodle 塗鴉板

您需要登錄後才可以評論 登錄 | 按這成為會員

重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

手機版| 廣告聯繫

GMT+8, 2024-12-23 08:45 , Processed in 0.011011 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回頂部