千呼万唤始出来~等了那么久的新一代 LTS!距离上一代 LTS (即 5.1)感觉已经好遥远了呢!新版的 LTS 同样会有为期两年的 Bug 修复和三年的安全更新!而其他对于一般的发行版则是提供六个月的 Bug 修复支持,一年的安全修复支持。
按照惯例,接下来让我们罗列一下新版的特性~
Whoops 回归#
用过 Laravel 4 的人都会十分想念的PHP 错误处理框架,而现在,它已经正式回归了!详情请看 Whoops 回归。
集合 Dump#
一个能让你在集合中直接使用 dd
的新功能,详情看这个 Collections 支持 dd 跟 dump。
<?php Song::all() ->filter ->platinum ->dump() ->filter(function ($song) { return $song->released_on >= \Carbon\Carbon::parse('-10 years'); }) ->dd();
异常渲染#
如果定义了一个公共「响应」方法就可以对异常进行渲染。 在早期的 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 响应接口#
Laravel 为响应方法新增了一个 Responsable 接口。 实现接口的类可以从控制器方法返回。在准备响应到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); }
现在我们来看看这个 NewSongResponse
的类:
<?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); } }
如你所看到的,在默认情况下,程序会重定向到路由 songs.show
,而如果是通过 AJAX 发出的请求,就会自动响应 JSON 格式的内容。
更多内容可以查看 响应 Responsable 接口
请求验证方法#
在 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()
的使用。
相关的文章可以查看 验证器支持返回请求数据。
自定义验证规则的对象和闭包#
创建自定义规则对象是使用 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!'); } }] ]);
以上示例使用闭包来对属性的值的校验,如果验证失败,则返回失败参数。 而在你中规中矩的把验证内容搬到专用规则对象类之前,又或者仅仅只是一次性自定义验证的需求,用闭包来测试自定义的验证规则是最合适不过的。
使用新的 make:rule
命令创建自定义验证规则对象:
$ php artisan make:rule MyCustomRule
更多内容请查看文章 自定义验证规则。
Blade 模板命令 Auth & Guest#
新功能文章列表中也有提到过 Blade::if () 指令。 而 @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 允许你使用 Artisan命令 preset
删除所有前端脚手架,再从几个预设中重新进行选择。
通过运行 php artisan help preset
命令,你可以看到可供选择的内容有:none、bootstrap、vue 以及 react:
php artisan help preset Usage: preset <type> Arguments: type The preset type (none, bootstrap, vue, react) # 使用 react $ php artisan preset react # 清除脚手架 $ php artisan preset none
分离工厂文件#
之前的版本都是在 ModelFactory.php
文件中定义所有模型工厂。而现在,你可以为每个模型创建不同的文件。在运行创建新模型的命令时加上 -fm
选项可以为其创建工厂文件:
$ php artisan make:model -fm Post # 或者你也可以在创建模型的时候,使用 --all 同时创建控制器、迁移和工厂 $ php artisan make:model --all
当然也可以直接使用 make:factory
来创建工厂文件:
$ php artisan make:factory --model=Example ExampleFactory
migrate:fresh 迁移命令#
5.5 中新的 migrate:fresh
迁移命令能让你在开发中轻松地创建一个干净数据库。 这条命令可以自动为你删除所有数据库表并且运行迁移。
这听起来很像 migrate:refresh
命令,它会回滚并重新迁移。但通常在开发过程中,你会更倾向于一口气删除所有表再来运行迁移。而 migrate:fresh
做的正是这件事情。
RefreshDatabase
Trait#
RefreshDatabase
trait 是在测试期间迁移数据库的新方式。根据你是否使用内存数据库或传统数据库,这会是迁移测试数据库的最佳方法。 DatabaseTransactions
和 DatabaseMigrations
trait 仍然能在 5.5 中不使用新的 RefreshDatabase
trait 的情况下进行升级。
withoutExceptionHandling()
方法#
基本测试用例继承了一个 withoutExceptionHandling()
方法,它能够禁用测试的异常处理。禁用异常处理之后就可以在测试中捕获异常,声明异常,而不是响应异常处理程序。如果你想要查看实际的异常状况时,这会是一个很有用的调试工具。
包自动发现#
虽然 Laravel 包不会很难安装,但是有了包自动发现功能之后,你就可以不用在服务容器中设置提供器或别名。甚至,你还可以禁用特定软件包的自动发现~