Laravel 5.5 LTS 现已发布
发表于 作者: Paul Redmond
Laravel 5.5 版本现已正式发布!此版本充满了新功能和改进,以下是一个快速视频总结了主要功能
Taylor Otwell 最近在推特上描述了他对 Laravel 5.5 的想法
明天离开参加 @LaraconEU。下周发布 5.5。最喜欢的版本。喜欢框架现在的形态。从来没有像现在这样高兴。 ????
— Taylor Otwell (@taylorotwell) 2017 年 8 月 25 日
Laravel 5.5 是下一个 LTS 版本
Laravel 5.5 是 Laravel 的下一个长期支持 (LTS) 版本(上一个 LTS 版本是 5.1)。LTS 版本在两年内提供 bug 修复,三年内提供安全修复。
常规次要版本在六个月内提供 bug 修复,一年内提供安全修复。
Whoops 包
您可能还记得 Laravel v4 中的 filp/whoops 包,它为最令人沮丧的调试时刻提供了优雅的堆栈跟踪。Whoops 包在 Laravel 5.5 中回归!
集合转储
另一个很棒的调试功能(我之前曾在包或宏中见过)是集合转储方法
<?php Song::all() ->filter ->platinum ->dump() ->filter(function ($song) { return $song->released_on >= \Carbon\Carbon::parse('-10 years'); }) ->dd();
阅读我们的 集合转储文章 以了解更多详细信息。
异常渲染
异常现在可以渲染响应,如果它们定义了公共的“response”方法。通常,在早期版本的 Laravel 中,您可能会在 App\Exceptions\Handler::render()
方法中添加一个检查,并根据异常类型有条件地发送回响应。
在 5.5 中,您可以直接抛出异常,并且它可以在没有处理程序中添加额外逻辑的情况下进行响应
<?php // throw new TerribleSongException($song) in a controller... namespace App\Exceptions; use App\Song; class TerribleSongException extends \Exception{ /** * @var \App\Song */ protected $song; public function __construct(Song $song) { $this->song = $song; } /** * @param \Illuminate\Http\Request $request */ public function render($request) { return response("The song '{$this->song->title}' by '{$this->song->artist}' is terrible."); }}
您也可以在异常类中实现 Responsable
接口,Laravel 将自动响应。
Responsable 接口
Responsable 接口是 Laravel 中的另一个响应添加内容 我们曾在 Laravel 新闻中介绍过。实现此接口的类可以从控制器方法中返回;路由器现在在从 Illuminate\Routing\Router
准备响应时检查 Responsable
的实例。
以下是一个示例,将响应详细信息留给 NewSongResponse
对象
public function store(Request $request){ $data = request()->validate([ 'title' => 'required', 'artist' => 'required', 'description' => 'required', 'duration' => 'required|numeric', 'released_on' => 'required|date_format:Y-m-d', 'gold' => 'boolean', 'platinum' => 'boolean', ]); $song = new Song($data); $song->save(); return new NewSongResponse($song);}
以下是如何实现 Responsable 接口以创建新歌曲的类的示例
<?php namespace App\Http\Responses; use App\Song;use Illuminate\Contracts\Support\Responsable; class NewSongResponse implements Responsable{ /** * @var \App\Song */ protected $song; /** * @param \App\Song $song */ public function __construct(Song $song) { $this->song = $song; } public function toResponse($request) { if ($request->wantsJson()) { return response() ->json($this->song) ->header('Location', route('songs.show', $this->song)) ->setStatusCode(201); } return redirect() ->route('songs.show', $this->song); }}
在此简单示例中,如果通过 AJAX 进行请求,您可以自动使用 JSON 进行响应,默认情况下,可以使用重定向到 songs.show
路由进行响应。
请求验证方法
在过去版本的 Laravel 中,您会将请求实例传递给控制器中的 $this->validate()
方法
$this->validate(request(), [...]);
现在,您只需在请求对象上调用 validate
$data = request()->validate([ 'title' => 'required', 'artist' => 'required', 'description' => 'required', 'duration' => 'required|numeric', 'released_on' => 'required|date_format:Y-m-d', 'gold' => 'boolean', 'platinum' => 'boolean',]);
此调用验证风格的另一个好处是,返回值就像 Request::only()
一样,只返回验证调用中提供的键。只返回验证过的键是一个很好的约定,避免使用 Request::all()
。
自定义验证规则对象和闭包
我最喜欢的 Laravel 5.5 功能无疑是新的自定义验证规则对象和闭包。创建自定义规则对象是使用 Validator::extend 创建自定义规则 (您仍然可以使用) 的绝佳替代方法,因为它更清晰地显示了规则逻辑的位置。验证规则对象可能如下所示
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class CowbellValidationRule implements Rule{ public function passes($attribute, $value) { return $value > 10; } public function message() { return ':attribute needs more cowbell!'; }}
使用此验证规则的示例如下
<?php request()->validate([ 'cowbells' => [new CowbellValidationRule], 'more_cowbells' => [function ($attribute, $value, $fail) { if ($value <= 10) { $fail(':attribute needs more cowbell!'); } }]]);
闭包风格采用属性和值,以及一个 fail 参数,如果验证规则应该失败,则调用它。闭包是实验自定义验证的好方法,然后再将其提取到专用规则对象,或者用于一次性的自定义验证需求。
要创建自定义验证规则对象,可以使用新的 make:rule
命令
$ php artisan make:rule MyCustomRule
我们有一篇专门介绍 自定义验证规则 的文章,请务必查看!
Auth 和 Guest Blade 指令
我们已经写过 5.5 中的 Blade::if() 指令。5.5 中的一些新的条件指令是 @auth
和 @guest
。
通常,您可能会使用类似以下内容来检查 Blade 中是否已认证用户
@if(auth()->check()) {{ -- authenticated --}}@endif @if(auth()->guest())
您现在可以使用以下指令来实现相同的效果
@auth Welcome {{ user()->name }}!@endauth @guest Welcome Guest!@endguest
前端预设
在开始一个新项目时,Laravel 5.5 默认提供 Vue.js 脚手架。在 Laravel 5.5 中,您现在可以选择几个预设,并使用 Laravel 5.5 中的“preset” Artisan 命令删除所有前端脚手架。
如果您查看帮助信息,您会发现它允许您选择“none”、“bootstrap”、“vue”或“react”
php artisan help presetUsage: preset <type> Arguments: type The preset type (none, bootstrap, vue, react) # Use react$ php artisan preset react # Clear scaffolding$ php artisan preset none
单独的工厂文件
工厂文件以前定义在一个 ModelFactory.php 文件中。现在,您可以为每个模型创建不同的文件。在创建新模型时,可以创建工厂文件
$ php artisan make:model -fm Post # Or you can create a controller, migration, and factory$ php artisan make:model --all
您也可以使用“make:factory”直接创建工厂文件
$ php artisan make:factory --model=Example ExampleFactory
migrate:fresh 迁移命令
5.5 中的新“migrate:fresh”迁移命令是开发中创建干净数据库的不错补充。migrate:fresh
命令会删除所有数据库表,然后运行迁移。
您可能熟悉现有的 migrate:refresh
命令,它会回滚迁移,然后重新运行它们。通常在开发中,您只希望删除表,获得一个新的数据库,并运行迁移。
RefreshDatabase 特性
在测试方面,RefreshDatabase 特性是在测试期间迁移数据库的新方法。此新特性会根据您是否使用内存数据库或传统数据库,采用最优的方式来迁移测试数据库。DatabaseTransactions
和 DatabaseMigrations
特性在 5.5 中仍然可用,允许您在不使用新的 RefreshDatabase 特性的情况下进行升级。
withoutExceptionHandling() 方法
基础测试用例继承了一个名为 withoutExceptionHandling()
的方法,它允许你禁用测试的异常处理。禁用异常处理允许你在测试中捕获异常并断言异常,而不是让异常处理程序响应。当你的测试做了你没有预期的操作时,这也是一个有用的调试工具,你想要看到实际的异常。
自动包发现
我们最后要看的功能是自动包发现。虽然 Laravel 包通常不难安装,但包检测功能意味着你不需要设置提供者或别名。你可以为特定包禁用自动发现。
从Taylor Otwell 关于此功能的文章以及我们的帖子中了解更多关于此功能的信息。
了解更多关于 Laravel 5.5 的信息
请务必查看我们的Laravel 5.5内容,以深入了解。Laracasts 有一个关于所有这些功能的完整系列。此外,请查看官方文档、发布说明以及升级指南。