Laravel 5.5 LTS 正式发布!(包含新功能说明)

file

千呼万唤始出来~等了那么久的新一代 LTS!距离上一代 LTS (即 5.1)感觉已经好遥远了呢!新版的 LTS 同样会有为期两年的 Bug 修复和三年的安全更新!而其他对于一般的发行版则是提供六个月的 Bug 修复支持,一年的安全修复支持。

按照惯例,接下来让我们罗列一下新版的特性~

Whoops 回归

file

用过 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

更多内容可以查看 @茄子 的文章 Laravel 前端预配置

分离工厂文件

之前的版本都是在 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 做的正是这件事情,详情可以查看文章 迁移新命令:Fresh

RefreshDatabase Trait

RefreshDatabase trait 是在测试期间迁移数据库的新方式。根据你是否使用内存数据库或传统数据库,这会是迁移测试数据库的最佳方法。 DatabaseTransactionsDatabaseMigrations trait 仍然能在 5.5 中不使用新的 RefreshDatabase trait 的情况下进行升级。

withoutExceptionHandling() 方法

基本测试用例继承了一个 withoutExceptionHandling() 方法,它能够禁用测试的异常处理。禁用异常处理之后就可以在测试中捕获异常,声明异常,而不是响应异常处理程序。如果你想要查看实际的异常状况时,这会是一个很有用的调试工具。

包自动发现

虽然 Laravel 包不会很难安装,但是有了包自动发现功能之后,你就可以不用在服务容器中设置提供器或别名。甚至,你还可以禁用特定软件包的自动发现~

有兴趣的童鞋可以前往查看文章 包自动发现

想了解更多关于 Laravel 5.5 的资讯?

Laracasts 上有一系列完整 5.5 新功能介绍 视频,社区上也有 Laravel 资讯集锦。你还可以查看 官方中文文档发行说明升级指南。另外,你也可以点击左上方的 订阅专栏 及时了解第一手的 Laravel 资讯 或者使用这个 插件

另外,5.5 的文档还在持续翻译中,有空的各位请多多帮忙 review 吖!详情请看站长大人的 [需要 Reviewer...] Laravel 5.5 文档翻译召集,快来加入翻译吧!

人生苦短 我用 Laravel

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 32

:joy: 感谢琳姐把我从苦海中解救出来!!!:pray: :pray: :pray:

6年前 评论

@ziao :satisfied: 不枉我今晚加班还特地把这玩意赶出来

6年前 评论

介绍前段预设de那一段文字。vue写成了vu
( ・᷄ ᵌ・᷅ )

6年前 评论
幽弥狂

通过运行 php artisan help preset 命令,你可以看到可供选择的内容有:none、bootstrap、vu 以及 react:

6年前 评论
JeffreyBool

播报员慢了一拍呀

6年前 评论

不错,不错,已打赏。

6年前 评论

@张高元 哈哈,没慢~不过我的翻译速度确实不快:smile:

6年前 评论
JeffreyBool

@JokerLinly 赞 ?

6年前 评论
rovast

使用 laravel new laravel55 时报错了

[InvalidArgumentException]
  Script "post-install-cmd" is not defined in this package
6年前 评论
rovast

@罗浩
附上最后几段。使用的是 homestead, box 是2.1.0的

sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.5.5)
phpunit/phpunit suggests installing ext-xdebug (*)
phpunit/phpunit suggests installing phpunit/php-invoker (^1.1)
Generating optimized autoload files
> [@php](https://learnku.com/users/10050) -r "file_exists('.env') || copy('.env.example', '.env');"

  [InvalidArgumentException]
  Script "post-install-cmd" is not defined in this package

run-script [--timeout TIMEOUT] [--dev] [--no-dev] [-l|--list] [--] [<script>] [<args>]...

Application ready! Build something amazing.
6年前 评论

感谢,公司框架已升级

6年前 评论
# 清除手脚架
$ php artisan preset none

清除手脚架 :sweat_smile:

6年前 评论

@bitqiu :astonished: 改好了,真是细心,我都没发现

6年前 评论

不介绍一下 eloquent-resources ?让更多的人知道

6年前 评论
DukeAnn

等换完工作,升级

6年前 评论

@罗浩 把 laravel installer 升级到最新版本再试试

6年前 评论

昨天伴随着 Laravel 5.5 的发布,laravel 员工 Mohamed Said‏在 twitter 上发布了一系列关于
Laravel 5.5 的小技巧。在这里做一下搬运工,一起学习一下。

条件式推送队列

现在在事件监听器中新增一个shouldQueue函数,用来判断是否要将监听器推送到队列里。这个新功能可以很好的控制队列的流量,防止过载。

file

whereKeyNot

find函数功能相反的函数。查找表里面不是传入数组键值的记录。

file

中间表别名

在5.5中你可以在多对多关系中为中间表添加别名,使程序表达更自然,更优雅。

file

重载关系

有时候,你需要使用load为模型重新载入关联模型数据。但是任何已经被载入的关联数据还会被重新查询载入一遍。现在你可以使用loadMissing,避免已载入关联模型的重复查询加载。

file

optional 函数

新版本中新增了一个optional帮助函数。来解决Null Object pattern。具体的可以查看laracasts 视频,使用和原理都介绍的十分清楚。

file

载入 json 翻译文件

laravel 在前几个版本中引入了更简单的 json 翻译文件来解决 i18n。现在在你开发的 laravel 包中,你可以使用loasJsonTranslationsFrom 函数来载入你的包 json 翻译文件。

file

6年前 评论

另外贴一些 Laravel 5.5 学习资源供大家参考.
Laracasts-What's New in Laravel 5.5
LaraconUS-Taylor 关于5.5新特性介绍
当然还有我们最最最重要的 laravel-china 5.5 中文文档

6年前 评论

@Corrida 好的哈,下班有时间就整理一下

6年前 评论
Atzcl

@罗浩 使用 php artisan key:generate 生成一个就行了

6年前 评论

LTS一发布,又有的玩儿了?

6年前 评论
Atzcl

@Atzcl 更正下,准确的方法是更新 composer: composer global update

6年前 评论

然而经过测试,性能降低了不少。相对与5.4和5.2来说

6年前 评论
Complicated

66666666666,加了好多实用的特性,,奈何公司是5.3

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!