# 升級指南
- [從 5.4 升級至 5.5.0](#upgrade-5.5.0)
<a name="upgrade-5.5.0"></a>
## 從 5.4 升級到 5.5.0
#### 預計升級耗時:1小時
> {note}我們盡量記錄每一個可能的破壞性變化。但因為其中一些不兼容變更只存在于框架很不起眼的地方,事實上只有一小部分可能會影響到你的應用程序。
### 更新依賴
在 `composer.json` 文件中將 `laravel/framework` 更新為 `5.5.*` 。 此外,你還應該將 `phpunit/phpunit` 依賴關系更新到 `~6.0`。
> {tip} 如果你是通過使用 `laravel new` 來安裝 Laravel 程序,則應該使用命令 `composer global update` 來更新 Laravel 安裝程序包。
#### Laravel Dusk
Laravel Dusk `2.0.0` 已經發布,該版本同時兼容 Laravel 5.5 和 Chrome 的 headless 模式測試。
#### Pusher
Pusher 事件廣播驅動現在需要 `~3.0` 版本的 Pusher SDK。
### Artisan
#### `fire` 方法
該方法已重命名為 `handle` 方法。
#### `optimize` 命令
隨著對 PHP 操作碼緩存的最新改進,不再需要優化 Artisan 命令。你應該從部署腳本中刪除對此命令的任何引用,因為它在未來的 Laravel 版本中會被刪除。
### 用戶授權
#### `authorizeResouce` 控制器方法
當將一個大駝峰命名的模型名稱傳遞給 `authorizeResource` 方法時,為了和資源控制器的行為相匹配,生成的路由會用蛇形命名法來命名。
#### `before` 策略方法
如果類中不包含與給定名稱相匹配的方法,則不會調用策略類的 `before` 方法。
### 緩存
#### 數據庫驅動
如果你正在使用數據庫緩存驅動,那在你第一次部署升級至 Laravel 5.5時,應該先運行 `php artisan cache:clear` 命令。
### Eloquent
#### `belongsToMany` 方法
如果你在 Eloquent 模型中重寫了 `belongsToMany` 方法,應該更新方法簽名來映射新增的參數:
/**
* 定義多對多關系。
*
* @param string $related
* @param string $table
* @param string $foreignPivotKey
* @param string $relatedPivotKey
* @param string $parentKey
* @param string $relatedKey
* @param string $relation
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function belongsToMany($related, $table = null, $foreignPivotKey = null,
$relatedPivotKey = null,$parentKey = null,
$relatedKey = null, $relation = null)
{
//
}
#### 模型的 `is` 方法
如果你重寫了 Eloquent 模型的 `is` 方法 ,則應該從該方法中刪除 `Model` 的類型提示。這將允許 `is` 方法接受 `null` 作為參數。
/**
* 確定兩個模型是否具有相同的ID并且屬于同一個表。
*
* @param \Illuminate\Database\Eloquent\Model|null $model
* @return bool
*/
public function is($model)
{
//
}
#### 模型 `$events` 屬性
模型上的 `$events` 屬性應該重命名為 `$dispatchesEvents`。由于大量用戶需要定義事件關系,導致與舊屬性名稱的沖突,因此進行了更改。
#### 中間表 `$parent` 屬性
`Illuminate\Database\Eloquent\Relations\Pivot` 類中受保護的 `$parent` 屬性已被重命名為 `$pivotParent` 。
#### 關聯 `create` 方法
`BelongsToMany`、`HasOneOrMany` 以及 `MorphOneOrMany` 類中的 `create` 方法已被修改為 `$attributes` 參數提供默認值。如果你重寫了這些方法,你應該更新你的簽名來匹配新的定義。
public function create(array $attributes = [])
{
//
}
#### 軟刪除模型
刪除 「軟刪除」 模型時,模型上的 `exists` 屬性將保持為 `true` 。
#### `withCount` 列格式化
當使用別名時,`withCount` 方法將不再自動將 `_count` 附加到生成的列名稱上。例如,在 Laravel 5.4 中,以下查詢會將 `bar_count` 列添加到查詢中:
$users = User::withCount('foo as bar')->get();
但是在 Laravel 5.5 中,別名將嚴格按照給定的方式使用。如果要將 `_count` 追加到結果列,則必須在定義別名時指定該后綴:
$users = User::withCount('foo as bar_count')->get();
### 異常格式
在 Laravel 5.5 中,所有的異常(包括驗證異常)都被異常處理程序轉換成 HTTP 響應。另外,驗證錯誤默認返回的 JSON 格式已經更改。新格式遵循以下規則:
{
"message": "The given data was invalid.",
"errors": {
"field-1": [
"Error 1",
"Error 2"
],
"field-2": [
"Error 1",
"Error 2"
],
}
}
但是,如果你想沿用 Laravel 5.4 錯誤提示的 JSON 格式,則可以將以下方法添加到 `App\Exceptions\Handler` 類中:
use Illuminate\Validation\ValidationException;
/**
* 將驗證異常轉換成 JSON 響應
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Validation\ValidationException $exception
* @return \Illuminate\Http\JsonResponse
*/
protected function invalidJson($request, ValidationException $exception)
{
return response()->json($exception->errors(), $exception->status);
}
#### JSON 身份驗證嘗試
此更改也會影響通過 JSON 進行的身份驗證嘗試的驗證錯誤返回的格式。在 Laravel 5.5 中,身份驗證失敗的 JSON 將按照上述新的格式約定返回錯誤消息。
#### 表單請求注意事項
現在自定義了單個表單請求的響應格式,應重寫該表單請求的 `failedValidation` 方法 ,并拋出一個包含自定義響應的 `HttpResponseException` 實例。
use Illuminate\Http\Exceptions\HttpResponseException;
/**
* 處理失敗的驗證嘗試。
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json(..., 422));
}
### 文件系統
#### `files` 方法
`files` 方法與 `allFiles` 方法類似,會返回一個 `SqlFileInfo` 對象的數組。之前的 `files` 方法會返回一個字符串路徑名的數組。
### 郵件
#### 未使用的參數
未使用的 `$data` 和 `$callback` 參數已從 `Illuminate\Contracts\Mail\MailQueue` 契約的 `queue` 和 `later` 方法中刪除
/**
* 在隊列中發送新的電子郵件
*
* @param string|array|MailableContract $view
* @param string $queue
* @return mixed
*/
public function queue($view, $queue = null);
/**
* n 秒后在隊列中發送新的電子郵件
*
* @param \DateTimeInterface|\DateInterval|int $delay
* @param string|array|MailableContract $view
* @param string $queue
* @return mixed
*/
public function later($delay, $view, $queue = null);
### 請求
#### `has` 方法
`$request->has` 方法現在對于空字符串和 `null` 將返回 `true`。新添加的 `$request->filled` 方法提供了之前的 `has` 方法的行為。
#### `intersect` 方法
`intersect` 方法已被移除。你只需在調用 `$request->only` 時使用 `array_filter` 來代替該方法:
return array_filter($request->only('foo'));
#### `only` 方法
`only` 方法現在只會返回請求中實際存在的屬性。如果你想保留該方法的舊功能,可以使用 `all` 方法來替代。
return $request->all('foo');
#### 輔助函數 `request()`
輔助函數 `request` 將不再檢索嵌套的鍵。如果有需要,你可以使用 `request` 中的 `input` 方法來達成此目的:
return request()->input('filters.date');
### 測試
#### 認證聲明
一些認證斷言被重命名為與框架的其他斷言更好的一致性:
<!-- <div class="content-list" markdown="1"> -->
- `seeIsAuthenticated` 被重命名為 `assertAuthenticated` ;
- `dontSeeIsAuthenticated` 被重命名為 `assertGuest` ;
- `seeIsAuthenticatedAs` 被重命名為 `assertAuthenticatedAs` ;
- `seeCredentials` 被重命名為 `assertCredentials` ;
- `dontSeeCredentials` 被重命名為 `assertInvalidCredentials` 。
<!-- </div> -->
#### 偽造郵件
如果你使用偽造 Mail 來請求中是否有可用的**隊列** ,則應該使用 `Mail::assertQueued` 來代替 `Mail::assertSent` 。 這種區別允許你明確聲明郵件已在隊列中等待發送,而不是在請求期間發送。
### 翻譯
#### `LoaderInterface`
`Illuminate\Translation\LoaderInterface` 該接口已被移動至 `Illuminate\Contracts\Translation\Loader`。
### 驗證
#### 驗證方法
所有的驗證器的驗證方法已由 `protected` 改為 `public` 。
### 視圖
#### 動態的 「with」 變量
當允許動態的 `__call` 方法與視圖共享變量時,該變量將會自動使用駝峰式命名。舉例如下:
return view('pool')->withMaximumVotes(100);
`maximumVotes` 變量可以在模板中訪問,如下所示:
{{ $maximumVotes }}
### 其他
你還可以查看 `laravel/laravel` 在 GitHub 中的更改。雖然這些更改不是必需的,但你可能希望將這些文件與應用程序保持同步。本升級指南中將介紹其中一些更改,而其他的則不會被介紹,例如更改配置文件或注釋。你可以使用 [GitHub 的比較工具](https://github.com/laravel/laravel/compare/5.4...master) 輕松查看你在意的變更的內容。
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
|---|---|---|---|
| [@我做我的夢](https://laravel-china.org/users/18485) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/18485_1503368993.jpeg?imageView2/1/w/100/h/100"> | 翻譯 | A new to Laravel,and hope Laravel is the last framework for me. |
| [@JokerLinly](https://laravel-china.org/users/5350) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/5350_1481857380.jpg"> | Review | Stay Hungry. Stay Foolish. |
---
> {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。
>
> 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。
>
> 文檔永久地址: https://d.laravel-china.org
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- HomeStead
- Valet
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- 門面(Facades)
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 重定向
- Session
- 表單驗證
- 錯誤與日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- API認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 交流說明