Logicky Blog

Logickyの開発ブログです

Laravel10から11にアップグレードしてみる

readouble.com

これを見ながらやっていきます。環境はWindows11, PowerShellです。 まずは、上記の「Composerの依存パッケージ」に書いてあるものを全部composer.jsonに反映して、composer updateしました。

Windowsだと動かない、laravel/horizon等をcomposer require laravel/horizon --ignore-platform-reqsでインストールしている関係上、composer update --ignore-platform-reqsとしないとエラーになりました。また、kitloong/laravel-migrations-generatorがLaravel11に対応していないというエラーが出たので削除しました。

あとは、Cashier, Sanctumを使っているので、下記を実行する必要があるらしい。マイグレーションファイルをpublishしないとマイグレーション実行ができなくなったということかな。

php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=sanctum-migrations

Sanctumについては、下記も対応が必要らしい。

config/sanctum.php設定ファイルで、authenticate_session, encrypt_cookies, validate_csrf_tokenミドルウェアへの参照を以下のように更新してください。

'middleware' => [
    'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
    'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
    'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
],

Laravel11では、新しいデフォルトのアプリケーション構造が導入され、デフォルトのファイルが少なくなっています。つまり、新しいLaravelアプリケーションには、サービスプロバイダ、ミドルウェア、設定ファイルの数が少なくなっています。 しかし、Laravel10アプリケーションをLaravel11にアップグレードするときに、アプリケーション構造の移行を試みることはお勧めしません。Laravel11はLaravel10のアプリケーション構造もサポートするように注意深く調整してあります。

と書いてあるので、あんまりファイルとかディレクトリ構成をいじるのはやめよう。

マイグレーションのこれは結構見直しが必要になるのかもと思った。

Laravel10では、このマイグレーションはカラムのunsigned、default、comment属性を保持していました。しかし、Laravel11からマイグレーションにはカラムに以前定義していた属性もすべて含める必要があります。含めなければ、それらを削除します。

changeメソッドはカラムのインデックスを変更しません。そのため、カラムを変更する際には、インデックス修飾子を使って明示的にインデックスを追加したり削除したりしてください。

でも、下記にあるように、一旦マイグレーションを圧縮すればいいのか。

既存カラムの属性を保持するために、アプリケーション内の既存の全「変更(change)」マイグレーションを更新したくない場合は、単純にマイグレーションを圧縮してください。

php artisan schema:dump

上記を実行して、手動で既存のマイグレーションファイルを全部削除しました。 ローカル環境で、下記を実行して、きちんと動作するのを確認しました。 これは、DBの中身を全部消して、最初からマイグレーション実行するコマンドです。

> php artisan migrate:fresh

Laravel Cashier (Stripe)のアップグレード対応

Cashier(Stripe)は下記にある対応が必要でした。

github.com

Stripe Webhookの再作成

Cashierが使うStripe APIバージョンが変わったので、再作成する必要があるようです。

php artisan cashier:webhook --disabled

上記は、.envにあるURLを元にwebhookを作成します。 --disableをつけることで、無効な状態で作成されます。 イベントの送信先は、https://example.com/stripe/webhookとなります。 私は本番環境のサーバで上記コマンドを実行して、本番用のwebhookを作成しました。

環境変数のSTRIPE_WEBHOOK_SECRETに新しいwebhookの署名シークレットを登録して、新しいwebhookを有効にし、古い方を無効にする(削除する)ことで、新しいwebhookに切り替わります。

テーブルの一部変更

下記が変わりましたので、これ用のマイグレーションファイルを作成し、 php artisan migrate を実行します。

Schema::table('subscriptions', function (Blueprint $table) {
    $table->renameColumn('name', 'type');
});