* * * * *
[TOC]
## 從 5.5 升級至 5.6.0
#### 預計升級耗時:10 - 30 分鐘
> {note} 我們盡量記錄每一個可能的破壞性變化。但因為其中一些不兼容變更只存在于框架很不起眼的地方,事實上只有一小部分可能會影響到你的應用程序。
### PHP
Laravel 5.6 要求 PHP 7.1.3 或更高。
### 更新依賴
在?`composer.json`?文件中將?`laravel/framework`?更新為?`5.6.*`?。此外,你還應將?`fideloper/proxy`?依賴關系更新至?`~4.0`。
此外,如果你使用下面的官方 Laravel 包,你應將升級至最新版本:
* Dusk (升級至?`~3.0`)
* Passport (升級至?`~5.0`)
* Scout (升級至?`~4.0`)
當然,不要忘記檢查你應用程序的第三方包能否支持 Laravel 5.6。
#### Symfony 4
所有 Laravel 底層使用到的 Symfony 組件都已經更新至?`~4.0`?發布版本。如果你在應用中直接的與 Symfony 組件進行了交互,你應該瀏覽下[?Symfony 變更日志](https://github.com/symfony/symfony/blob/master/UPGRADE-4.0.md)。
#### PHPUnit
你必須將你應用中依賴的?`phpunit/phpunit`?更新至?`~7.0`?版本。
### Arrays
#### `Arr::wrap`?方法
傳遞給?`Arr::wrap`?方法的?`null`?現在將返回一個空數組。
### Artisan
#### `optimize`?命令
先前被棄用的?`optimize`?Artisan 命令已經被移除。 隨著?`php`?對自身和對操作碼緩存的改進,?`optimize`?命令已經無法再提供任何性能上的提升。因此你可以將?`php artisan optimize`?從你的?`composer.json`?文件的?`scripts`選項中移除。
### Blade
#### HTML 實體編碼
在以前的 Laravel 版本中,Blade(和?`e`?全局輔助函數)不會對 HTML 實體進行雙重編碼。 這不是底層?`htmlspecialchars`?函數的默認行為,在呈現內容或將內聯 JSON 內容傳遞給 JavaScript 框架時可能會導致意外行為。
在 Laravel 5.6 中,Blade 和?`e`?全局輔助函數默認會對特殊字符進行雙重編碼。 使得這些功能與底層的?`htmlspecialchars`?PHP 函數的默認行為保持一致。 如果你想保持以前防止重復編碼的行為,你可以使用?`Blade::withoutDoubleEncoding`?方法:
~~~
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}
~~~
### 緩存
#### 速率限制器?`tooManyAttempts`?方法
從未使用過的?`$decayMinutes`?參數已經被在此方法的簽名中移除。 如果你自己實現重寫了此方法, 你需要同時在你的方法簽名中移除該參數。
### 數據庫
#### Morph 列的索引命令
為了更好的性能,通過?`morphs`遷移方法構建列的索引的方式已經被撤消。如果你正在你的遷移中使用?`morphs`?方法,可能會在試圖運行遷移中的?`down`?方法時接收到一個錯誤。如果應用保持在開發狀態, 你可以使用`migrate:fresh`?命令重新構建你的數據庫。如果已經在線上生產狀態,你應該為?`morphs`?方法傳遞一個明確的索引名稱。
#### 加入?`MigrationRepositoryInterface`?方法
新的方法?`getMigrationsBatches`?已經被添加到?`MigrationRepositoryInterface`?。 在你正在定義自己的關于該類的實現的極少數的情況下,你應該將此方法添加到你的實現中。作為示例,你可以查看框架中的默認實現。
### Eloquent
#### `getDateFormat`?方法
現在?`getDateFormat`?方法的訪問修飾符由?`protected`?變為了?`public`?。
### 哈希
#### 新的配置文件
現在所有的哈希配置文件保存在?`config/hashing.php`?配置文件中。 你應該在程序中復制一份?[默認配置文件](https://github.com/laravel/laravel/blob/develop/config/hashing.php)。大部分時候,默認的?`bcrypt`?驅動已經夠用了,然而你也可以使用?`argon`?驅動。
### Helpers
#### `e`?輔助函數
在 Laravel 的舊版本中,Blade (還有?`e`?輔助函數) 不會對 HTML 實體進行雙重編碼。這不是底層?`htmlspecialchars`?函數的默認行為,并且在呈現內容或將內聯 JSON 內容傳遞給 JavaScript 框架時可能會導致意外行為。
在 Laravel 5.6 中,Blade和?`e`?輔助函數默認會對特殊字符進行雙重編碼。這些功能與底層?`htmlspecialchars`?PHP 函數的默認行為保持一致。如果你想保持之前防止雙重編碼的行為,你可以將?`false`?作為第二個參數傳遞給?`e`?輔助函數:
~~~
<?php echo e($string, false); ?>
~~~
### Logging
#### 新的配置文件
所有的日志配置現在都存放在它自己的?`config / logging.php`?配置文件中,你應該在你自己的應用程序中放置一個[默認配置文件](https://github.com/laravel/laravel/blob/develop/config/logging.php)的副本,并根據你的應用程序的需要進行調整修改。
`log`?和?`log_level`?配置選項可以在?`config / app.php`?配置文件中刪除。
#### `configureMonologUsing`?方法
如果你使用?`configureMonologUsing`?方法為應用程序自定義 Monolog 實例,你現在應該創建一個?`custom`?日志通道。有關如何創建自定義頻道的更多信息,請查看?[full logging documentation](http://www.hmoore.net/tonyyu/laravel_5_6/786183#_181)。
#### 日志類?`Writer`
`Illuminate\Log\Writer`?類已經被重命名為?`Illuminate\Log\Logger`?。 如果你明確地將此類作為你的應用中的類之一的依賴項,你應該將類引用更新為新名稱。 或者, 二者選一地,你應該強烈考慮用標準化的?`Psr\Log\LoggerInterface`?接口來代替。
#### `Illuminate\Contracts\Logging\Log`?接口
因為與?`Psr\Log\LoggerInterface`?完全重復, 這個接口已經被移除。你應該用?`Psr\Log\LoggerInterface`?接口來代替。
### 郵件
#### `withSwiftMessage`?回調
在 Laravel 之前的版本中,使用?`withSwiftMessage`?方法注冊的 Swift 消息定制化回調被稱為?*after*?內容已經被編碼并且添加到消息中。現在這些被稱為?*before*?內容回調被添加,它們允許你定制這些編碼或者是其他需要的消息選項。
### 分頁
#### Bootstrap 4
現在分頁鏈接被分頁器默認采用 Bootstrap 4 生成。使分頁器去生成 Bootstrap 3 的鏈接,可以在你的?`AppServiceProvider`?文件的?`boot`?方法中使用?`Paginator::useBootstrapThree`?方法:
~~~
<?php
namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 引導任何應用程序服務。
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapThree();
}
}
~~~
### 資源
#### `original`?屬性
[資源響應](http://www.hmoore.net/tonyyu/laravel_5_6/786276)?的?`original`?屬性現在會被設置成原始模型而不是 JSON 字符串或數組。在測試時這會更方便檢查響應的模型。
### 路由
#### 返回新創建的模型
當直接從路由返回一個新創建的 Eloquent 模型時,響應狀態現在會被自動設置成?`201`?而不是?`200`。 如果你有任何應用程序的測試的響應狀態確定預期是?`200`?,請升級成?`201`。
### 可信任代理
由于 Symfony HttpFoundation 的可信任代理功能發生了根本性的改變,因此必須對你的應用下的`App\Http\Middleware\TrustProxies`?中間件做輕微地改動。
之前是一個數組的?`$headers`?屬性,現在可以接收幾個不同值。 例如, 要信任所有的轉發標題,你可以將你的`$headers`?屬性更新為以下值:
~~~
use Illuminate\Http\Request;
/**
* 應該用來檢測代理的頭信息。
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
~~~
關于更多可用的?`$headers`?值,請查閱?[trusting proxies](http://www.hmoore.net/tonyyu/laravel_5_6/786157#_422)?的完整文檔 。
### 驗證
#### `ValidatesWhenResolved`?接口
為了避免和?`$request->validate()`?方法沖突,?`ValidatesWhenResolved`?接口 / trait 的?`validate`?方法已被改名為?`validateResolved`?。
### 其它
我們同樣鼓勵你去翻閱?`laravel/laravel`?[GitHub 倉庫](https://github.com/laravel/laravel)?中的修改記錄。 雖然很多修改不是必需的,但你可能希望這些文件與你的應用程序同步。本升級指南中只介紹了部分修改,而其它像修改配置文件或注釋等修改則不會介紹。你可以使用?[GitHub 比較工具](https://github.com/laravel/laravel/compare/5.5...master)?很輕松的查看這些修改并選擇對你重要的更新。
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄