Laravelは一昨年あたりから細目に更新を出すようになりました。と言っても、年に2回ですが、Laravelで書いた大きなプログラムを管理する私としてはそれでも「きつい」。それで長期サポートの5.5にあぐらをかいているわけだが、しかし。

以下は5.7に掲載されていたサポートのスケジュール表。

これによると、5.5のバグ修正は今年の8月で終了ではないですか、ということで、急いで更新のキャッチアップとなりました。更新に関して私が気づいた点をいくつか書きます。5.6の更新はどうしたんだい?と思う方、すいません、変更はマイナーなので記事とするほど書くことは少なく。しかし、実際には5.5 ⇒ 5.6、5.6 ⇒ 5.7と順番に進める必要はあります。

フェイカーの言語設定

hasManyのフェイクデータの作成」の記事で、フェイカーを使用して日本語のフェイクデータの作成に、ちらと触れましたが、この設定は、今までのデフォルトのconfig/app.phpのファイルには含まれていませんでした。このバージョンから、以下のように含まれています。

...
    /*
    |--------------------------------------------------------------------------
    | Faker Locale
    |--------------------------------------------------------------------------
    |
    | This locale will be used by the Faker PHP library when generating fake
    | data for your database seeds. For example, this will be used to get
    | localized telephone numbers, street address information and more.
    |
    */

    'faker_locale' => 'en_US',
...

もちろん、

'faker_locale' => 'ja_JP',

と変えましょう。

早速tinkerでテストしてみましょう。

Psy Shell v0.9.9 (PHP 7.2.16 — cli) by Justin Hileman
>>> factory(App\User::class)->make()
=> App\User {#3191
     name: "井高 拓真",
     email: "wkimura@example.net",
     email_verified_at: "2019-06-05 19:46:16",
   }

Bladeのorが??に変わる

layout.blade.phpのように使用するプログラムが同じBladeを共有するときに、例えば、プログラムにより$titleという変数が未定義になるかもしれないとすると、Bladeではこう設定してエラーとなるのを避けていました。

...
{{ $title or '' }}
...

しかし、or は、phpの??を使えば良いということで廃止になりました。??は、php7で登場した新しい比較演算子で、いちいちisset()を使用する必要がなくなりました。

...
{{ $tile ?? '' }}
...

私のプロジェクトでもいくつかこの変更の対象となるBladeのファイルがありました。ほとんどが、上記のように未定義は空として表現するので、以下のようにsedコマンドを使用して一括変換としました。

grep -rl " or ''" | grep php | xargs sed -i "s/\sor\s''/ ?? ''/g"

resources/assetsのディレクトリが廃止となる

Laravelのディレクトリ構造は、以前はバージョンが変わるごとに変わっていました。最近は落ち着いてきていいなと思っているとこれです。しかし、今回の変更は、そうたいしたことではないです。

Laravel 5.6以前は、resourcesのディレクトリの階層は、

resources
├── assets
│   ├── js
│   │   ├── app.js
│   │   ├── bootstrap.js
│   │   └── components
│   │       └── ExampleComponent.vue
│   └── sass
│       ├── app.scss
│       └── _variables.scss
├── lang
│   └── en
│       ├── auth.php
│       ├── pagination.php
│       ├── passwords.php
│       └── validation.php
└── views
    └── welcome.blade.php

が、5.7になると、

resources
├── js
│   ├── app.js
│   ├── bootstrap.js
│   └── components
│       └── ExampleComponent.vue
├── lang
│   └── en
│       ├── auth.php
│       ├── pagination.php
│       ├── passwords.php
│       └── validation.php
├── sass
│   ├── app.scss
│   └── _variables.scss
└── views
    └── welcome.blade.php

と、assetsのディレクトリの中身がすべてその上のディレクトリに移されました。また、それを反映して、webpack.mix.jsも変わっています。

しかし、この変更はオプションであり、変えたくないなら以前のままでもOKです。

メールログを分ける

Laravel 5.5までは、すべてのログはstorage/logs/laravel.logに保存というワンパターンであったのが、5.6ではconfig/logging.phpにおいて、いろいろなカスタマイズの設定が可能となりました。ログを従来のファイルに保存ではなくslackにも転送が可能であるし、ファイルでも従来のように1つのファイルにすべてを保存でなく、ファイル名に日付を入れて違うファイルに保存も可能です。

さらに、5.7では、config/mail.phpにおいて、

...
   /*
    |--------------------------------------------------------------------------
    | Log Channel
    |--------------------------------------------------------------------------
    |
    | If you are using the "log" driver, you may specify the logging channel
    | if you prefer to keep mail messages separate from other log entries
    | for simpler reading. Otherwise, the default channel will be used.
    |
    */

    'log_channel' => env('MAIL_LOG_CHANNEL'),

のように、メールのログチャンネルも指定可能です。

例えば、

.envにおいて、

...
MAIL_DRIVER=log
...

と設定するとプログラムから送信されるメールの内容はすべて、storage/logs/laravel.logに保存されます。開発時において便利な機能です。しかし、他のエラーログとごっちゃになってわかりづらかったです。

しかし、5.7において、

...
        'mail' => [
            'driver' => 'single',
            'path' => storage_path('logs/mail.log'),
            'level' => 'debug',
        ],
...

と新しくmailというログチャンネルを作成し、

.envにおいて、

...
MAIL_DRIVER=log
MAIL_LOG_CHANNEL=mail
...

と指定すれば、laravel.logではなくstorage/logs/mail.logのファイルにメールがすべて保存されるようになります。

By khino