Laravel 6.0 アップデートメモ

2019/09/04 リリース。おめでとうございます。5.9 を飛ばしての LTS バージョンになりました。5.5が以前のLTSでしたので久々のLTSになります。（5.5 → 6.0 へのアップグレード量は多い気がするの…）

このバージョンからバージョン番号の法則性に [semver](https://semver.org/) が採用されます。なんかしれっと新しい機能が追加されたりしても追っかけられるようになりました。

そして Laravel をいい感じにサーバレスにさせる [Vapor](https://vapor.laravel.com/) に対応しているみたいです。

- [Laravel 6 is Now Released](https://laravel-news.com/laravel-6)
- [Laravel 6 Upgrade Guide](https://laravel.com/docs/6.x/upgrade)
- [Laravel Vapor](https://vapor.laravel.com/)

そんなわけで、アップグレードメモ。今回も変更点多いけど、細かいところや以前から消える予定の物が消えたので、アップグレード事態は一時間で終わるかも？

メモ書き程度に一覧を書いているけど、`ADD`,`LOW` 部分は気が向いたら追加する。

- [**HIGH** : Authorized Resources & viewAny](#high--authorized-resources--viewany)
- [**HIGH** : String & Array Helpers](#high--string--array-helpers)
- [medium : PHP 7.2 Required](#medium--php-72-required)
- [medium : Authentication RegisterController](#medium--authentication-registercontroller)
- [medium : Carbon 1.x No Longer Supported](#medium--carbon-1x-no-longer-supported)
- [medium : Database `Capsule::table` Method](#medium--database-capsuletable-method)
- [medium : Eloquent Arrayable & toArray](#medium--eloquent-arrayable--toarray)
- [medium : Eloquent `BelongsTo::update` Method](#medium--eloquent-belongstoupdate-method)
- [medium : Eloquent Primary Key Types](#medium--eloquent-primary-key-types)
- [medium : Localization `Lang::trans` and `Lang::transChoice` Methods](#medium--localization-langtrans-and-langtranschoice-methods)
- [medium : Localization `Lang::getFromJson` Method](#medium--localization-langgetfromjson-method)
- [medium : Queue Retry Limit](#medium--queue-retry-limit)
- [medium : Resend Email Verification Route](#medium--resend-email-verification-route)
- [medium : The Input Facade](#medium--the-input-facade)
- Optional : The `AWS_REGION` Environment Variable
- LOW: Authorization Responses
- LOW: The `Illuminate\Contracts\Auth\Access\Gate` Contract
- LOW: The `cursor` Method
- LOW: The `MustVerifyEmail` Contact
- LOW: Mail Mandrill & SparkPost Drivers Removed
- LOW: Notifications Nextmo Routing Removed
- LOW : Password Validation in PasswordReset
- LOW : The `between` method in scheduling
- LOW : Rackspace Driver Removed in Storage
- ADD : Route URL Generation & Extra Paramators
- NEW : Facade/Ignition
- NEW : Improved Authorization Responses
- NEW : Job Middleware
- NEW : Lazy Collections
- NEW : Eloquent Subquery Enhancements
- NEW : Laravel UI


## **HIGH** : Authorized Resources & viewAny

- see : [Authorization via Controller Helpers / Laravel 6.0](https://laravel.com/docs/6.0/authorization#via-controller-helpers)
- see : [Authorization via Controller Helpers / Laravel 5.8](https://laravel.com/docs/5.8/authorization#via-controller-helpers)

Controller Helper にて、Policy Method `viewAny` が追加されました。それに対応した Controller Method 側には `index` が追加され、すでに `index` メソッドがあるばあいは呼ばれなくなるそうです。

## **HIGH** : String & Array Helpers

Laravel Helper にあった関数 `str_` や `array_` が新しい laravel/helpers パッケージに移りました。今までどおり使うには `composer require laravel/helpers` を実行して取り込んでください。


## NEW : Facade/Ignition

開発環境時のエラーページに [Ignition](https://github.com/facade/ignition) が採用されたそうです。


## NEW : Improved Authorization Responses

認証時のメッセージをかんたんに変更できて見せられるようになりました。

Router/Controller の実行コードに `Gate::inspect('view', $flight)->denied()` や `$this->deny('Explanation of denial')` といった感じで書けるようになりました。

see : [Gate Response / Laravel 6.0](https://laravel.com/docs/6.0/authorization#gate-responses)


## NEW : Job Middleware

Job に Middleware を被せられるようになりました。やったね、これで特定の Job のログの書き出し先を変更するのがちょっと楽になるよ！

see : [Job Middleware / Laravel 6.0](https://laravel.com/docs/6.0/queues#job-middleware)


## New : Lazy Collections

遅延評価っぽい。

see : [Lazy Collection / Laravel6.0](https://laravel.com/docs/6.0/collections#lazy-collection-methods)


## NEW : Eloquent Subquery Enhancements

サブクエリーに対応しました。

……どういうクエリーが発行されるかドキュメント見ただけじゃわからんので、自身で検証してください。

see : [Eloquent Advanced Subqueries / Laravel6.0](https://laravel.com/docs/6.0/eloquent#advanced-subqueries)

## NEW : Laravel UI

Laravel に梱包されていた JS まわりが分離され、 [laravel/ui](https://github.com/laravel/ui) となりました。

see : [Laravel UI / Laravel6.0](https://laravel.com/docs/6.0/frontend)


## medium : PHP 7.2 Required

PHP 7.1 以下は非推奨になりました。PHP 7.1 は 2019.12.1 にサポートが切れます。

see : https://www.php.net/supported-versions.php

## medium : Authentication RegisterController

Laravel 標準の `RegisterController` に変更がありました。

`RegisterController` の小クラスで  `registered` や `register` メソッドを使用しているとき、親クラスの `registered` メソッドでユーザの追加やイベントの発火などをしているので、 `parent::registered()` や `parent::register` を呼び出さないとユーザの新規登録に失敗します。

## medium : Carbon 1.x No Longer Supported

Laravel が Carbon1.x のサポートを打ち切りますので、Carbon2.0 にアップグレードしてください。

Carbon2 は TimeZone 表記(YYYY-MM-DD HH:ii:ssZZZZ) 対応がメインっぽい。

see : [Drop Carbon v1 / github.com](https://github.com/laravel/framework/pull/28683)

## medium : Database `Capsule::table` Method

**注意** この変更は `illuminate/database` を使っている *Laravelでない* アプリケーションに影響があります。(Lumen ってことやろか？)

`Illuminate\Database\Capsule\Manager::table` メソッドの第２引数が変わったので、それに合わせて変更をしてください。

see : [Capsule table / Laravel 6.0 Upgrade guide](https://laravel.com/docs/6.0/upgrade#capsule-table)

## medium : Eloquent Arrayable & toArray

Eloquent の `toArray` メソッドの帰り値が `Illuminate\Contracts\Support\Arrayable` を実装する属性を普通の配列(`array`)にキャストするようになりました。

## medium : Eloquent `BelongsTo::update` Method

`$model->user()->update([]);` のばあいだと event が発生していしまいますが `$model->user->update([]);` のばあいだと event が発生しなくなりました。

## medium : Eloquent Primary Key Types

Primary Key は int/bigint だけだったのが `string` も対応できるようになりました。

## medium : Localization `Lang::trans` and `Lang::transChoice` Methods

Lang クラスのメソッド名の変更がありました。

- `Lang::trans` => `Lang::get`
- `Lang::transChoice` => `Lang::choice`

`Illuminate\Contracts\Translation\Translator` を使用しているクラスも同様に変更が必要です。

## medium : Localization `Lang::getFromJson` Method

`Lang::get` と `Lang::getFromJson` が統合されました。 `Lang::getFromJson` を呼んでいる部分は、 `Lang::get` を呼び出すように変更する必要があります。

## medium : Queue Retry Limit

`php artisan queue:work` において、Jobの実行が失敗結果のときは再実行を、成功するまで無限回実行します。しかし Laravel6 では一回失敗したらすぐに `failed` になるように変更されました。もし今まで通りの成功するまで実行する場合は `--tries=0` オプションを追加してください。

（これ Redis や Database の接続が死んだとき、`failed_queue` テーブルにデータが入らないときは、死んだままになるはずよね…？）

（これ Laravel Vapor に対応させるために追加されたオプションよね。）

## medium : Resend Email Verification Route

標準の再メール認証が Get Request だったのを、 Post Request + csrf 付きになりました。古いテンプレートに変更を加えてください。

## medium : The Input Facade

`Input` Facade は `Request` Facade と機能がかぶっているので削除されました。`Input::get()` は `Request::input()` に置換してください。