# # 升級說明
## 從 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)中的修改記錄