Laravel 5.7 Release And Upgrade memo

# Laravel 5.7 Release And Upgrade memo

いつものごとく、メモ書き。[9/10にリリース](https://twitter.com/laravelphp/status/1039249658630078465)されていました。書いてたけど、書いてたメモを消してしまったので今頃です。

5.7 は LTS ***ではない*** ので、2019/03/04 までバグ修正の保守期間、2019/09/04 までセキュリティフィックス期間となるみたいです。一年です。

## 参考

1. [Release Note](https://laravel.com/docs/5.7/releases)
2. [Upgrade Guide](https://laravel.com/docs/5.7/upgrade)

## High Impacts

影響が大きいものを。

1. `public/svg` ディレクトリを追加。そこに `500.svg`,`403.svg`,`404.svg` などといったファイルを [Github](https://github.com/laravel/laravel/tree/5.7/public/svg) からダウンロードしてきて設置してください。
2. Blade タグで使用していた `or` が削除されました。代わりに `??` を使用してください。
3. `Route::redirect` のHTTP Statusが [301](https://http.cat/301) から [302](https://http.cat/302) に変更されました。301 を使うときは `Route::redirect("/from", "/to", 301)` としてください。301/302 リダイレクトの違いは [301リダイレクトと302リダイレクト使い方　ページ・サイト移転方法と期間 アレグロのSEOブログ](https://www.allegro-inc.com/seo/301-redirect-setting) や [302 Found MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/302) で確認してください。

## laravel/passport

もし Laravel/Passport を使用している場合は、それのバージョン指定を `^7.0` としてください。

## Email Verification

メールアドレスの確認が取れた日付を `users` テーブルの `email_verified_at` レコードに保存するようにできるようになりました。 

1. `User` Model に `Illuminate\Contracts\Auth\MustVerifyEmail` インターフェースを実装すればいいみたい。そして、 `email_verified_at` カラムを追加するマイグレーションを云々。
2. `'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class` を `app.php` とかに追加してやってください。
3. Router の設定をしているファイルに `Auth::routes(['verify' => true]);` を追加してくださいな。
4. `EventServiceProvider` にイベントを登録する必要があります。下記のような感じ。

```php
      \Illuminate\Auth\Events\Registered::class => [
          \Illuminate\Auth\Listeners\SendEmailVerificationNotification::class,
      ],
```

詳しくはこっちのリンク: [https://laravel.com/docs/5.7/verification](https://laravel.com/docs/5.7/verification)

## Validation

ちょっとだけ変更があります。 `Validation::make` などで確認をした入力値は、入力した値しか返しません。Validation に書かれていない値は削除されます。下記を参考。

    $data = Validator::make([
        'person' => [
            'name' => 'Taylor',
            'job' => 'Developer'
        ]
    ], ['person.name' => 'required'])->validate();
    
    dump($data);
    
    // 今までは...
    ['person' => ['name' => 'Taylor', 'job' => 'Developer']]
    
    // 今回からは...
    ['person' => ['name' => 'Taylor']]

## Guest User Gates / Policies

無名関数などで登録した Gate の引数で、認証していないけど確認はしたい場合には、下記のようなコードを登録できる。っぽい話。

    Gate::define('update-post', function (?User $user, Post $post) {
        // ...
    });

## Symfony Dump Server

`dump` 関数を使って画面出力してデバッグしていたことを、ターミナルでdumpの出力結果を受け取れるようになります。パッケージは分離されているので、Laravel 5.6 以上だと使えるみたいです。

see: [https://github.com/beyondcode/laravel-dump-server](https://github.com/beyondcode/laravel-dump-server)

## Notification Localization

Notificationの通知を多言語化できるようになったっぽいです。

    $user->notify((new InvoicePaid($invoice))->locale('es'));

## Console Testing

ask/choise で使われている場合、コンソールコマンドのテストをすることが難しかったですが、 `expectsQuestion`, `expectsOutput`, `assertExitCode` を使えば可能になります。

## URL Generator & Callable Syntax

URL作成の `action` で  `action('controller@index')`と記述していた箇所が、 `action([Controller::class, 'index'])` と記述できるようになりました。

## Paginator Links

ペジネーションのページ一覧で、ページ数の出力制限ができるようになったっぽいです。そいや出来なかったのか。気づかなかった。

    {{ $paginator->onEachSide(5)->links() }}

## Filesystem Read / Write Streams

FlySystem に `readStream` と `writeStream` が追加されましたので、クラウド間のIOができるようになったっぽいです。前からなかったっけな…

    Storage::disk('s3')->writeStream(
        'remote-file.zip',
        Storage::disk('local')->readStream('local-file.zip')
    );

## Routing

`Route::redirect` の HTTP Status Code は `302` へ変更されたっぽいです。意図的に 301 を使いたい場合は下記のように変更する必要があります。

    // Return a 302 redirect...
    Route::redirect('/foo', '/bar');
    
    // Return a 301 redirect...
    Route::redirect('/foo', '/bar', 301);
    
    // Return a 301 redirect...
    Route::permanentRedirect('/foo', '/bar');

see: [https://ja.wikipedia.org/wiki/HTTPステータスコード#id="3xx_Redirection_.E3.83.AA.E3.83.80.E3.82.A4.E3.83.AC.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3"](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89#id=%223xx_Redirection_.E3.83.AA.E3.83.80.E3.82.A4.E3.83.AC.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3%22)

## Blade

変更があります。 `or` は非推奨となりましたので、PHP 標準の `??` を使うようにしてください。

    // Laravel 5.6...
    {{ $foo or 'default' }}
    
    // Laravel 5.7...
    {{ $foo ?? 'default' }}