Laravel11の変更点を見てみる

こんにちは、コバヤシです。 今回はLaravelの次期バージョンであるLaravel11の新機能を見てみたいと思います。

Laravel11のリリース時期

laravel11は2024/2/6にリリースされることがアナウンスされていましたが、
この記事を書いている2024/2/10時点では、まだリリースされていないようです。
公式では2024年第1四半期となっていました。

laravel.com

Laravel11のインストール

正式にリリースされていないので、インストールには--devを付ける必要があります。

laravel new app-name --dev

composerからのインストールの場合は以下で。

composer create-project --prefer-dist laravel/laravel app-name dev-master

インストールが終わったので、主な変更点を見ていきたいと思います。

モデルキャスト方法の変更

モデルのキャストの指定が$castsプロパティではなく、castsメソッドを使用する形になりました。

protected $casts = [
        'published_at' => 'datetime',
    ];

としていたのが、

protected function casts(): array
    {
        return [
            'published_at' => 'datetime',
        ];
    }

となります。 メソッドになることで、キャスト処理を追加するのが簡単になりそうですね。

ミドルウェア

Laravel11ではミドルウェアディレクトリが無くなっています。しかしミドルウェア自体が無くなってしまったわけではなく、
php artisan make:middlewareで生成すれば以前と同じ場所に生成されるようです。 必要なものは必要な時に作るということでしょう。

又、ミドルウェアはapp/Http/Kernel.phpに記述していましたが、このファイルも無くなっています。 では、どこに記述するのかというとbootstrap/app.phpになります。

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        // api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        // channels: __DIR__.'/../routes/channels.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

となっているので、withMiddlewareのところに以下のように書くようです。

<?php
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'some_key' => \App\Http\Middleware\MyMiddleware::class,
        ]);
  
        $middleware->append(\App\Http\Middleware\MyMiddleware::class);
  
        $middleware->appendToGroup('web', \App\Http\Middleware\MyMiddleware::class);
    })

withExceptionsもあるので、Exceptionあたりの処理もこちらに移ったみたいですね。

Config

Configディレクトリが空になっています。ミドルウェアと同じように必要になったら作成すれば以前と同じように使えます。
又、必要なものはvendor/laravel/framework/config/から持ってくれば大丈夫だと思います。

マイグレーション

マイグレーションファイルも変わっています。
以下はユーザーテーブルを作るマイグレーションファイルですが、ユーザーテーブルだけではなく「password_reset_tokens」や「sessions」も同時に作るような記述になっています。
デフォルトで「sessions」テーブルが作られるようになって、一つ手間が減りました。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

        Schema::create('password_reset_tokens', function (Blueprint $table) {
            $table->string('email')->primary();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });

        Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->foreignId('user_id')->nullable()->index();
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->longText('payload');
            $table->integer('last_activity')->index();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
        Schema::dropIfExists('password_reset_tokens');
        Schema::dropIfExists('sessions');
    }
};

Dumpable

デバックの機能を提供するトレイトが提供されます。
これを組み込むことで、どんなクラスにでもデバック機能を付与できるようです。

詳細は以下で確認してください。 laravel-news.com

まとめ

ざっくりと変更点を見てきましたが、Laravel 11の変更点は一言で言えば「スリム化」でしょうか。
普段使わないようなディレクトリやファイル類はapp以下から消え、必要な時に作るという方針になったようです。
確かに使わないものは見えない方がスッキリして視認性が良くなりますし、初めて触る方の混乱も少なくなるだろうと思います。
Laravel 11の正式なリリースは不明ですが、実際に使えるようになった時にすんなり利用できるように調査を進めていきたいと思います。