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.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前 评论

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