Laravel8 Release Notes まとめ

laravel8リリースノートまとめサムネイル Laravel

Laravel8がリリース

2020年9月8日にLaravel8がリリースされました!!
使用してみる前にまずは変更点等々の調査としてRelease Notesを読んでいきます。
コードは結構省いて変わっている部分のみを基本的には記述しているので詳しくはRelease Notesを参照してください。
Release Notesは以下にあります。

Release Notes - Laravel - The PHP Framework For Web Artisans

サポートポリシーについて

バージョンをあげるかどうかにも関わるので、まずはサポートポリシーについてです。
過去バージョン(6以降)のサポートポリシーですが以下になります。

バージョンリリース日バグ修正セキュリティ対応
6(LTS)2019年9月3日2021年9月3日2022年9月3日
72020年3月3日2020年10月6日2021年3月3日
82020年9月8日2021年4月6日2021年9月8日
Laravelサポートポリシー

Laravel6が2年間のバグ修正と3年間のセキュリティ対応があるので、今のところ何か作るとしたらLaravel6で作るのが妥当ですね。
ちなみに、LTSでない場合のリリースは6ヵ月のバグ修正と1年間のセキュリティ対応です。
すでにLaravel7で作成している場合は、バグ対応が終了するので可能であればLaravel8への移行をした方が良さそうです。

Laravel8の新機能や変更点

Laravel Jetstream

ログイン、登録、メールチェック、二段階認証、セッション管理、Laravel Sanctum(https://readouble.com/laravel/7.x/ja/sanctum.html)のサポート、チーム管理ができるようです。
LaravelでもSPA使用する機会が多いので良さそう。これは試したい。

Models Directory

デフォルトのmodelsの場所がapp/modelsに変更されました。このバージョンからわざわざ作らなくてもよくなります。modelを探す時はまずはapp/modelsディレクトリの存在確認、なければapp以下となるようなので、すでにapp以下にmodel が作られているプロジェクトを移行する時はディレクトリがなければ、移動しなくても問題なさそう。

Model Factory Classes

Factoryがクラス化されました。

$factory->define(User::class, function(Faker $faker)
{
  return [
    'name' => $faker->name
  ]
})

のように書いていたのが

class UserFactory extends Factory
{
  protected $model = User::class;

  public function definition()
    {
        return [
            'name' => $this->faker->name,
        ];
    }
}

こんな感じでFactoryクラスを継承して書くことができるようなりました。
使用する時もmodelに紐づいてくれて

User::factory()->count(50)->create();

と書くことができます。
クラスになったことによって、モデル内のメソッドによって作成するデータの状態を変更できます。
今までのfactoryでは値を渡していたのでこれは業務に沿った形がわかりやすくなって良さそうです。
以下のようなメソッドがUser Modelに定義してあるとすると

public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

クラスベースなので

User::factory()->count(5)->suspended()->create();

で実際に使用するModelのメソッドを使ってデータを作成することができる。
また、リレーションがmodelに定義してあれば、リレーション先のデータ作成に関してもシンプルにかけるようです。

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

シンプルで便利。

migration squashing

開発が進んで溜まってくmigrationファイル(わかる。。)を、単一のSQLファイルにまとめることができるようになりました(使用しているDBがMySQLまたはPostgreSQLであれば)。

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

SQLファイルはdatabase/schemaに作成されるようです。
何もmigrationファイルが実行されていない状態であれば、migrationファイル実行前にこの吐き出したschemaフォルダのSQLファイルから実行されてくれます。
時が立つにつれてmigrationファイルが溜まっていって何が何だかわからない状態だったので助かります。

job batching

Busファサードのbatchメソッドを利用してバッチ処理することができるようになりました。
batchメソッドでは、thenやcatch、finallyが使用できる。

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
    // All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
    // First batch job failure detected...
})->finally(function (Batch $batch) {
    // The batch has finished executing...
})->dispatch();

バッチ処理は、順序管理やエラー管理が大変なのでこれは便利。

improved rate limiting

RateLimiterファサードを使用することで時間あたりのアクセス回数制限を簡単にかけることができます。forメソッドで名前と内容を定義して、Routeのmiddlewareで使用可能です。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

uploadsという制限を定義して

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });
});

middlewareで使用する。
以前よりわかりやすくなってます。

Improved Maintenance Mode

以前のLaravelのメンテナンスモードでは、IPアドレスでメンテナンスなしへのアクセス許可を出していましたが、このバージョンからsecretオプションを使用することでトークンでのメンテナンスなしへのアクセス許可を出せるようになりました。
トークンを使用したアドレスにアクセスするとクッキーが発行とルートへリダイレクトが行われてメンテナンスモードなしで見れるようです。

また、デプロイ中のcomposer installが終わっていない段階等でアクセスされるとメンテナンスモードでもエラーが発生することがあったため、メンテナンス中のエラーページを事前にレンダリングしておくオプションができました。これによりメンテナンスモード中のエラーをなくすことができます。

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

でメンテナンスモードにして

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

にアクセスすればメンテナンスモードなしでサイトにアクセスできる。

Closure Dispatch / Chain

新しく追加されたcatchメソッドを使用することで、dispatchに指定された処理のどれかが正常終了しなかった場合に実行される処理を記述することができるようになりました。

dynamic Blade components

ある変数をの値から動的に描画されるコンポーネントを指定できるようになりました。

<x-dynamic-component :component="$componentName" class="mt-4" />

使い道はあるけど、わかりづらくなりそうな気もする。

Event Listener Improvements

イベントへの登録がEvent::listenメソッドを使用することで簡単に行うことができるようになりました。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {
    //
});

…使いそうで今まで使ってきていないのであまりよくわかっていません。。

time testing helpers

テストで時間を作りたいときなどに役に立つヘルパーが、このバージョンのLaravelからベースクラスに含まれるようになりました。

public function testTimeCanBeManipulated()
{
    // Travel into the future...
    $this->travel(5)->seconds();
    $this->travel(5)->days();

    // Travel into the past...
    $this->travel(-5)->hours();

    // Travel to an explicit time...
    $this->travelTo(now()->subHours(6));

    // Return back to the present time...
    $this->travelBack();
}

ありがたい。

Artisan serve Improvements

serveコマンドのリロード機能が強化されて、.envファイルが書き換わった時にもリロードが実施されるようになりました。これ結構面倒くさいと感じていたのでいい感じです。

Tailwind pagination views

ページネーションのCSSはBootstrapではなく、 Tailwind CSSをデフォルトに変更しました。
Tailwind CSSはカスタマイズ性が高いフレームワークで、様々なデザインへ対応できるようです。

Routing Namespace Updates

RouteServiceProviderを使用してルーティングの定義をする際に、以前のLaravelでは$namespaceにデフォルトでApp\Http\Controllersが指定されていたので問題なくUserController等を解決することができた。しかし、Laravel8からはnamespaceはnullになるため解決できなくなります(えっ、、なんでだろう??)。
Laravel7を使用してい流場合は$namespaceをRouteServiceProviderに定義することで問題なくなります。

所感

基本的には今までもう少しなんとかなるといいな、、となっていた部分が解消されているように感じました。まだ実際に動かしていないため、間違っているところもあると思われるので、動かしながら随時更新していきます。

コメント

タイトルとURLをコピーしました