LoginSignup
135
59

More than 1 year has passed since last update.

1年半振りのメジャーバージョンアップ(予定)!Laravel9の新機能ピックアップ!

Last updated at Posted at 2021-12-01

Laravel Advent Calendar 2021 1日目の投稿です。
来月(2022年1月)、1年半ぶりのLaravelのメジャーバージョンアップするのでLaravel9の主要な変更点をまとめてみました。

リリース日

  • Laravel 8: 2020年9月
  • Laravel 9: 2022年1月(予定)
  • Laravel 10: 2023年1月(予定)
  • Laravel 11: 2024年1月(予定)

Symfony6.0が2021年11月30日にリリースされました。それに伴ってLaravel 9のリリースが2022年1月に延期されています。
また、Laravel 9以降は半年周期のメジャーリリースが1年周期になっています。

Version PHP (*) Release Bug Fixes Until Security Fixes Until
6 (LTS) 7.2 - 8.0 September 3rd, 2019 January 25th, 2022 September 6th, 2022
7 7.2 - 8.0 March 3rd, 2020 October 6th, 2020 March 3rd, 2021
8 7.3 - 8.1 September 8th, 2020 July 26th, 2022 January 24th, 2023
9 (LTS) 8.0 - 8.1 January 25th, 2022 January 30th, 2024 January 28th, 2025
10 8.0 - 8.1 January 24th, 2023 July 30th, 2024 January 28th, 2025

インストール要件

最低でも PHP8.0 以上である必要があります。
Laravel 9の内部でSymfony6.0が利用されており、PHP8.0が最小要件があるためLaravel 9にも同じ制限が適用されます。

新機能ピックアップ

Anonymous Stub Migrations

Laravel v8.37.0 でクラス名の衝突を防ぐために匿名マイグレーション機能がリリースされました。
Laravel 9.xでは php artisan make:migration 実行時に生成されるファイルが匿名マイグレーションがデフォルトとなります。(Laravel8.xではデフォルトのマイグレーションテンプレートはクラス名付きで生成されますが、匿名マイグレーションは利用可能です。)

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('first_name')->nullable();
        });
    }
};

これにより名前被りを気にせずマイグレーションファイルを作成できます。
マイグレーションファイル名は日付プレフィックスが付くので同名ファイルでも問題ありません。
また、稀によく発生していたマイグレーションクラスをリネームしてオートローダーが壊れる問題もこれで解消されそうです。

新しくクエリビルダーインターフェイスが追加

これらのクエリビルダークラス群が1つのインターフェース Illuminate\Contracts\Database\Query\Builder と契約しました。

文字列関数の内部実装の変更

最小要件がPHP8.0ということで、下記の関数の内部実装が変更されています。

Str::contains();
Str::startsWith();
Str::endsWith();

str_contains()str_starts_with() および str_ends_with() 関数が利用されています。
現時点では特に非推奨となっていませんが、PHPの標準関数で実現できるので今後はもしかしたら非推奨になる関数かもしれませんね。

SwiftMailerからSymfonyMailerへ

SwiftMailerが非推奨となり、Laravel9ではSymfonyMailerを使用するように変更されています。

lang ディレクトリがトップレベルへ

Laravel8までは resources/lang でしたがLaravel9からトップレベルへ移動されました。

Flysystem v2

AWS S3をLaravelで操作したい時に使うライブラリthephpleague/flysystem-aws-s3-v3

v2系はLaravel8で動作しませんでしたが、Laravel9からv2系がサポートされます。
アップグレードの際はご注意ください。

https://github.com/laravel/framework/pull/33612
https://qiita.com/ucan-lab/items/61903ce10a186e78f15f

Laravel インストーラにAPIオプションの追加

$ laravel new foo --api

HTMLを返さないAPIシステムのためのapiオプションがLaravelインストーラに追加されるそうです。
css, js関連ファイルが削除されたLaravelプロジェクトテンプレートを構築します。
(管理画面はやっぱり簡単なHTMLを返したいとかありそう...笑 簡単に戻せるならアリかな?)

server.php がLaravelのプロジェクトルートから削除

server.phpphp artisan server のコマンドを実行する際に使用されるファイルです。

laravel/laravel のルートディレクトリ配下にあった server.php が laravel/framework のフレームワーク本体の src/Illuminate/Foundation/resources/server.php に移動になりました。
Laravel9へアップグレードした際は不要なファイルになるのでこのファイルを削除する必要がありそうです。

Laravel8で追加された新機能

Laravel8.xで新しく追加された機能で気になったものをご紹介します。

Eloquent N+1検知機能

Laravel v8.43.0 でN+1検知機能がしれっと追加されていました。
N+1クエリーがあると例外が発生するため開発プロセスの初期段階でN+1クエリーを発見できます。

https://laravel-news.com/disable-eloquent-lazy-loading-during-development
https://github.com/laravel/framework/pull/37363
https://github.com/laravel/framework/releases/tag/v8.43.0

Enum型のサポート

Laravel v8.71.0 でEnum型を便利に扱えるようにキャスト機能やクエリー周りのサポートが行われています。

https://github.com/laravel/framework/pull/39608
https://github.com/laravel/framework/pull/39492
https://github.com/laravel/framework/pull/39597
https://github.com/laravel/framework/releases/tag/v8.71.0
https://github.com/laravel/framework/releases/tag/v8.70.0

参考

135
59
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
135
59