PHP
laravel

Laravel 5.7 Memo

Laravel 5.7 Release And Upgrade memo

いつものごとく、メモ書き。9/10にリリースされていました。書いてたけど、書いてたメモを消してしまったので今頃です。

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

参考

  1. Release Note
  2. Upgrade Guide

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::classapp.php とかに追加してやってください。
  3. Router の設定をしているファイルに Auth::routes(['verify' => true]); を追加してくださいな。
  4. EventServiceProvider にイベントを登録する必要があります。下記のような感じ。
      \Illuminate\Auth\Events\Registered::class => [
          \Illuminate\Auth\Listeners\SendEmailVerificationNotification::class,
      ],

詳しくはこっちのリンク: 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

Notification Localization

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

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

Console Testing

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

URL Generator & Callable Syntax

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

Paginator Links

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

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

Filesystem Read / Write Streams

FlySystem に readStreamwriteStream が追加されましたので、クラウド間の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"

Blade

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

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

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