Laravel 5.4 正式发布 📚 

![](https://dn-phphub.qbox.me/uploads/images/201701/25/1/dxcDfZsjA0.jpg?imageView2/1/w/1024/h/546)

> 转自 Laravel 资讯：https://news.laravel-china.org/posts/539

## Laravel Dusk2

当编写接口测试时，Laravel 提供了一组有用的帮助方法，用来方便地单击链接，填充表单文件或提交表单。Laravel 使用 Symfony BrowserKit 组件来模拟 Web 浏览器的行为。但是，如果应用程序使用 JavaScript 和 AJAX 来加载页面，就没 BrowserKit 啥事了。

Laravel 5.4 将引入 Laravel Dusk 这一新工具，来解决这个问题。

Dusk 能模拟浏览器的运行环境。它的目的是提供正确的方式进行页面交互测试，所以可以使用 Dusk 去点击按钮或者链接、填写表单、甚至拖放。

Dusk 利用 ChromeDriver 和 Facebook PHP-webdriver 进行接口测试。它作用于任何 Selenium 浏览器，而它自带的 ChromeDriver 默认情况下会根据你安装的方式（JDK 或 Selenium）进行保存。这使得 Dusk 很容易使用，而不需要经历设置 Selenium 和每次启动服务器这些艰难的过程。此外，Taylor Otwell 提到 Dusk 测试运行比 Selenium 更快。

> [@JokerLinly](https://laravel-china.org/users/5350) 的文章 [Laravel Dusk 又是啥？反正 Laravel 5.4 又能更好玩了](http://news.laravel-china.org/posts/531)

## Laravel Mix

Laravel Mix 是 Elixir 的升级版本，全新的 Mix 使用 Webpack 构建，而不是之前的 Gulp。此次因底层架构改变较大而重命名。

除非你对 Elixir 做了很多自定义设置，否则迁移应该不用费很大的劲，可以查看 Laracasts 对升级工具的介绍。


## Blade Components 和 Slots

Laravel Blade 在 5.4 中加入 Components 和 Slots 两个新的特性。 这个功能受到 Vue.js 的启发，能够将 HTML 元素简化为可重用区域。举个例子，假设你想在主页上添加一个 alert 框。

```php
// alert.blade.php
<div class="alert">
    {{ $slot }}
</div>
```


在模板里你可以这样加载：

```php
@component('inc.alert')
    This is the alert message here.
@endcomponent
```

> [@JokerLinly](https://laravel-china.org/users/5350) 的文章 [Laravel 在 5.4 中为 Blade 模板引擎增加新成员 —— Components & Slots](http://news.laravel-china.org/posts/528)

## 支持 Markdown 语法的 Emails


Laravel 5.3 引进了两个与电子邮件有关的新功能 Mailables 和 Notifications，能够让你通过电子邮件、短信和其他渠道发送相同的消息。

建立在这些改进的基础之上，Laravel 5.4 将引入一个全新的 Markdown 系统来创建电子邮件模板。

此功能实现了 Parsedown 解析器以及 Markdown Extra，这样就可以在邮件中发送表格了。

```php
@component('mail:message')

# Thank You

Thank you for purchasing from our store. 

@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent

@endcomponent
```

> [@JokerLinly](https://laravel-china.org/users/5350) 的文章 [在 Laravel 5.4 中你将可以使用 Markdown 语法书写邮件](http://news.laravel-china.org/posts/533)

## 自动化 Facades

现在你可以实时地使用 Facade 对任何类进行加载。下面是个例子：

```php
namespace App;

class Zonda 
{
    public function zurf()
    {
        return ‘Zurfing’;
    }
}
```

这样在你的控制器或者路由里：

```php
use Facades\ {
    App\Zonda
};

Route::get('/', function () {
    return Zonda::zurf();
});
```

> [@milkmeowo](https://laravel-china.org/users/7028) 的文章 [[Laravel 5.4] 新功能: 实时 Facade](https://laravel-china.org/articles/3659)

## 路由优化

随着 Laravel 5.4 开发 的持续，路由方面将会有两个新的改进，为大型应用程序而生的更好路由缓存和更加一目了然的路由注册方式。

```php
Route::name('profile')->get('user/{id}/profile', function ($id) {
    // some closure action...
});

Route::name('users.index')->middleware('auth')->get('users', function () {
    // some closure action...
});

Route::middleware('auth')->prefix('api')->group(function () {
    // register some routes...
});

Route::middleware('auth')->resource('photo', 'PhotoController');
```

路由缓存层的改进会让那些定义了超过一千条路由的大型应用看到希望的曙光。

> [@JokerLinly](https://laravel-china.org/users/5350) 的文章 [哎哟！Laravel 5.4 又改进路由啦！](http://news.laravel-china.org/posts/529)

## 集合增加高阶信息传递（HOM）支持

对此功能最好的解释就是使用例子。假如你相对集合里的每一个元素进行操作：

```php
$invoices->each(function($invoice) {
    $invoice->pay();
});
```

以上是老的写法，5.4 里你可以这样写：

```php
$invoices->each->pay();
```

> [@milkmeowo](https://laravel-china.org/users/7028) 同学对此功能做了详细的介绍，请前往查看 https://laravel-china.org/articles/3681 。

## 更多新功能

以下是不完全列表


- 新增辅助函数 `retry` 
- 新增辅助函数 `array_wrap`
- 新增默认 503 页面
- 整个核心加载类时重构为 `::class` 调用
- 增加密码重置的路由命名
- 支持 PhpRedis
- 增加  IPv4 和 IPv6 验证
- `date_format` 的验证现在更加准确 

## 升级到 Laravel 5.4

官方文档包含了升级指南。以下是你重点需要注意的。


Laravel Tinker 现在是独立的扩展包，你需要：

```
composer require laravel/tinker
```

安装完成后修改 `config/app.php` 增加：

```
Laravel\Tinker\TinkerServiceProvider
```

你原本的测试如果使用了 browser kit 的话，可以选择升级到 Laravel Dusk  或者加载原有的扩展包：

```
composer require laravel/browser-kit-testing --dev
```

最后你需要修改 `composer.json` 文件把 `laravel/framework` 指向 `5.4.*`。

## Laravel 5.4 更多链接：

- 官方升级文档：https://laravel.com/docs/5.4/upgrade
- 5.4 版本说明 https://laravel.com/docs/5.4/releases
- Laracasts 的关于 5.4 视频介绍：https://laracasts.com/series/whats-new-in-Laravel-5-4
- [Laravel 5.4] 新增 3 个全局中间件 https://laravel-china.org/articles/3664

## 关于 5.4 的翻译

我们计划春节假期的最后几天开始翻译，届时欢迎大家一起来参与 🍺