# # 升级说明
## 从 5.6 升级到 5.7
#### 预计升级时间:10-15分钟
>[success] 注:我们试图记录每一个可能发生的变化。因为大部分破坏性的变化在框架的内部,这些更改仅有一部分的更改可能影响你的应用。
### 更新依赖
在`composer.json`文件中更新`laravel/framework`依赖到`5.7.*`。
当然,不要忘记检查应用所使用的第三方扩展包是否支持 Laravel 5.7。
### 应用
#### `register`方法
**影响的可能性:非常低**
`Illuminate\Foundation\Application`类`register`方法中,未使用的参数`options`已经被移出,如果你重写了这个方法,需要更新方法的签名:
~~~php
/**
* 使用应用程序注册服务提供者。
*
* @param \Illuminate\Support\ServiceProvider|string $provider
* @param bool $force
* @return \Illuminate\Support\ServiceProvider
*/
public function register($provider, $force = false);
~~~
### Artisan
#### 调度任务链接 & 队列
**影响的可能性:低**
>[warning]在作业类中,如果一个连接 / 任务没有明确地传递给`job`方法的话,`$schedule->job`方法现在将识别任务类上设置`queue`和`connection`属性。
一般来说,这应该被认为是一个 bug 修复,然而,它被列为一个破坏性的改变。「[如果你遇到任何关于这个变化的问题,请告诉我们](https://github.com/laravel/framework/pull/25216)」。
### 认证
#### `Authenticate`中间件
**影响的可能性:低**
>[warning]`Illuminate\Auth\Middleware\Authenticate`中间件的`authenticate`方法会被更新为将`$request`作为第一个参数,如果你在自己的`Authenticate`中间件中重写了这个方法,需要更新中间件方法的签名:
~~~php
/**
* 确认用户是否登录到任何给定的警卫。
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
* @throws \Illuminate\Auth\AuthenticationException
*/
protected function authenticate($request, array $guards)
~~~
#### `ResetsPasswords`Trait
**影响的可能性:低**
>[warning]`ResetsPasswords`trait 中受保护的方法`sendResetResponse`现在接收`Illuminate\Http\Request`作为第一个参数。如果你覆盖了这个方法,你需要修改方法的签名:
~~~php
/**
* 获取重置密码成功的响应。
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetResponse(Request $request, $response)
~~~
#### `SendsPasswordResetEmails`Trait
**影响的可能性:低**
>[warning]`SendsPasswordResetEmails`trait 中受保护的方法`sendResetLinkResponse`现在接收`Illuminate\Http\Request`作为第一个参数。如果你覆盖了这个方法,你需要修改方法的签名:
~~~php
/**
* 获取重置密码成功链接的响应。
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
*/
protected function sendResetLinkResponse(Request $request, $response)
~~~
### 授权
#### The`Gate`契约
**影响的可能性:非常低**
>[warning]`raw`方法的可见性从`protected`变成`public`。此外,[它也被添加到了`Illuminate/Contracts/Auth/Access/Gate`契约中](https://github.com/laravel/framework/pull/25143):
~~~php
/**
* 获取授权回调的结果。
*
* @param string $ability
* @param array|mixed $arguments
* @return mixed
*/
public function raw($ability, $arguments = []);
~~~
如果你要实现这个接口,你需要把这个方法添加到实现中。
### Blade
#### The`or`操作符
**影响的可能性:高**
>[warning]Blade 的「or」操作符被移除了,可以使用 PHP 内置的`??`操作符替代:
~~~php
// Laravel 5.6...
{{ $foo or 'default' }}
// Laravel 5.7...
{{ $foo ?? 'default' }}
~~~
### Carbon
**影响的可能性:非常低**
>[warning]Carbon「macros」不再由 Laravel 的扩展库处理,而是直接通过 Carbon 库处理。我们希望这些变化没有对你的代码造成影响,但是如果有问题的话你可以[联系我们](https://github.com/laravel/framework/pull/23938)。
### Collections
#### `split`函数
**影响可能性: 低**
>[warning]`split`函数[已经更新为一直返回请求数量分块的个数](https://github.com/laravel/framework/pull/24088),除非原始集合的总数小于请求分块的个数.。准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。
### Cookie
#### `Factory`契约方法的参数
**影响可能性: 非常低**
>[warning]`Illuminate/Contracts/Cookie/Factory`接口的`make`和`forever`方法的参数默认值[有变动](https://github.com/laravel/framework/pull/23200). 如果你实现了这个接口的话,你应该更新你的实现方法。
### 数据库
#### `softDeletesTz`迁移方法
**影响可能性: 低**
>[warning]表结构生成器的`softDeletesTz`方法现在接收列名作为第一个参数,而`$precision`字段已经移动到了第二个参数的位置:
~~~php
/**
* 在表中添加一个 "deleted at" 的时间戳.
*
* @param string $column
* @param int $precision
* @return \Illuminate\Support\Fluent
*/
public function softDeletesTz($column = 'deleted_at', $precision = 0)
~~~
#### `ConnectionInterface`契约
**影响可能性: 非常低**
>[warning]`Illuminate\Contracts\Database\ConnectionInterface`契约的`select`和`selectOne`函数参数更新为提供新的`$useReadPdo`参数:
~~~php
/**
* 执行select语句并返回一条结果.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return mixed
*/
public function selectOne($query, $bindings = [], $useReadPdo = true);
/**
* 在数据库执行select语句.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return array
*/
public function select($query, $bindings = [], $useReadPdo = true);
~~~
同时, 将`cursor`方法添加到当前契约中:
~~~php
/**
* 通过数据库执行select语句并返回一个生成器.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return \Generator
*/
public function cursor($query, $bindings = [], $useReadPdo = true);
~~~
如果你实现了此接口的话,请将此方法添加到您的实现中。
#### SQL Server驱动优先级
**影响可能性: 低**
>[warning]在 Laravel 5.7之前,`PDO_DBLIB`驱动是默认的SQL Server PDO 驱动。 这个驱动是被微软反对的. 在Laravel 5.7中,如果`PDO_SQLSRV`驱动可用的话,`PDO_SQLSRV`将作为默认的驱动. 或者你可以选择使用`PDO_ODBC`驱动:
~~~php
'sqlsrv' => [
// ...
'odbc' => true,
'odbc_datasource_name' => 'your-odbc-dsn',
],
~~~
如果这些驱动都不可用, Laravel 将使用`PDO_DBLIB`驱动。
### Debug
#### Dumper 类
**影响可能性: 非常低**
>[warning]为了支持Symfony原生的方法dumpers:`Symfony\Component\VarDumper\VarDumper`和`Symfony\Component\VarDumper\Dumper\HtmlDumper`,
`Illuminate\Support\Debug\Dumper`和`Illuminate\Support\Debug\HtmlDumper`方法已被移除。
### Eloquent
#### `latest`/`oldest`方法
**影响可能性: 低**
>[warning]Eloquent查询构造器的`latest`和`oldest`方法更新,现在允许通过自定义的"创建时间"的数据库字段对查询的模型镜像排序。 准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。
#### `wasChanged`方法
**影响可能性: 非常低**
>[warning]Eloquent更改`wasChanged`方法将在`updated`模型事件**之前**调用,这一改变现在可用了。准确来说, 这是一个之前bug的修复; 但是,这是一个谨慎的改变。[如果你对此更新有任何疑问,请联系我们](https://github.com/laravel/framework/pull/25026)。
#### PostgreSQL 特殊浮点值
**影响的可能性:低**
>[warning]PostgreSQL 支持`Infinity`,`-Infinity`和`NaN`浮点值,在Laravel 5.7 之前的版本,当 Eloquent 模型实例中要转换数据类型的列为`float`、`double`或`real`时,会被转换成`0`。
而在Laravel 5.7中,这些值会被转换成相应的 PHP 常量`INF`、`-INF`和`NAN`。
### Email 认证
**影响的可能性:可选**
>[warning]如果你选择使用 Laravel 的[Email 认证服务](https://laravel-china.org/docs/laravel/5.7/verification),需要向你的应用中增加一些手脚架。
>[]首先,增加`VerificationController`到你的应用:[App\\Http\\Controllers\\Auth\\VerificationController](https://github.com/laravel/laravel/blob/develop/app/Http/Controllers/Auth/VerificationController.php)。
其次,增加认证视图文件,文件位置在`resources/views/auth/verify.blade.php`,视图内容可以从[GitHub](https://github.com/laravel/framework/blob/5.7/src/Illuminate/Auth/Console/stubs/make/views/auth/verify.stub)中获取。
最后,在调用`Auth::routes`方法时传递`verify`选项:
~~~php
Auth::routes(['verify' => true]);
~~~
### 文件系统
#### `Filesystem`契约方法
**影响的可能性:低**
>[warning][`Illuminate\Contracts\Filesystem\Filesystem`](https://github.com/laravel/framework/pull/23755)契约中增加了`readStream`和`writeStream`方法,如果你正在实现这个接口,请增加这些方法。
### Mail
#### 邮件动态传参转换
**影响的可能性:中**
>[warning]向邮件视图中动态传递的变量[现在会自动转换为"驼峰命名"](https://github.com/laravel/framework/pull/24232),这使邮件动态变量行为和动态视图变量保持一致。因为动态邮件变量非 Laravel 文档特性,所以对你的应用产生影响的可能性很小。
### 路由
#### `Route::redirect`方法
**影响的可能性:高**
>[warning]`Route::redirect`方法现在返回 HTTP 状态码为`302`的重定向,新增`permanentRedirect`方法实现`301`重定向。
~~~php
// 返回302重定向...
Route::redirect('/foo', '/bar');
// 返回301重定向...
Route::redirect('/foo', '/bar', 301);
// 返回301重定向...
Route::permanentRedirect('/foo', '/bar');
~~~
#### `addRoute`方法
**影响的可能性:低**
>[warning]`Illuminate\Routing\Router`类的`addRoute`方法的可见性从`protected`改为`public`。
### 表单验证
#### 嵌套验证数据
**影响的可能性:中**
>[warning]在以前版本的 Laravel 中,`validate`方法对嵌套验证规则返回的结果不正确,在 Laravel 5.7中已修复:
~~~php
$data = Validator::make([
'person' => [
'name' => 'Taylor',
'job' => 'Developer'
]
], ['person.name' => 'required'])->validate();
dump($data);
// 旧的结果...
['person' => ['name' => 'Taylor', 'job' => 'Developer']]
// 新的结果...
['person' => ['name' => 'Taylor']]
~~~
#### `Validator`Contract
**影响的可能性:非常低**
>[warning][`Illuminate/Contracts/Validation/Validator`契约新增](https://github.com/laravel/framework/pull/25128)`validate`方法:
~~~php
/**
* 根据数据运行表单验证规则。
*
* @return array
*/
public function validate();
~~~
如果你正实现这个接口,请新增此方法。
>[danger] 建议参考 `laravel/laravel`[GitHub 仓库](https://github.com/laravel/laravel)中的修改记录