はじめに
このガイドでは、Laravel 10 以前の旧アプリケーション構造(Kernel クラスや複数のサービスプロバイダーを持つ構造)から、Laravel 11 以降の Slim Application Skeleton へ移行する手順を解説します。
移行が必要になる場面
以下のような場合に移行を検討することがあります。- 新規参加メンバーが公式ドキュメントと照合しやすいように、プロジェクトを最新の標準構造に合わせたい
- Laravel 11 以降で新規作成したパッケージやスターターキットとの整合性を保ちたい
- 旧構造由来の設定ファイルやクラスを減らし、コードベースをシンプルにしたい
前提条件
このガイドでは、以下の状態を前提とします。- Laravel バージョンアップが完了している(
laravel/framework ^11.0以降) - 既存のテストがすべて通っている
- Laravel 11 以降のアプリケーション構造(Laravel 11 以降のアプリケーション構造を参照)を理解している
移行例
Laravel 10 + Breeze(Blade スタック)で作成したプロジェクトを Breeze のまま維持しつつ、アプリケーション構造だけを新構造へ移行する手順を示します。1
bootstrap/app.php を置き換える
旧 新(Laravel 11 以降):
bootstrap/app.php は $app インスタンスを生成してカーネルを登録する形式でした。これを
Application::configure() チェーンに置き換えます。旧(Laravel 10):withMiddleware() と withExceptions() のコールバックは、次のステップで削除するカーネルファイルの設定を移植する場所です。まずは空のままにして、後続のステップで追記します。2
HTTP カーネル(app/Http/Kernel.php)を削除する
app/Http/Kernel.php にはグローバルミドルウェア、ミドルウェアグループ、ミドルウェアエイリアスが定義されていました。旧(app/Http/Kernel.php):app/Http/Kernel.php
をそのまま削除できます。カスタマイズがある場合(独自ミドルウェアを追加・除外している場合)は、bootstrap/app.php の withMiddleware()
に移植してから削除してください。app/Http/Kernel.php を削除します。Laravel 11 では
TrustProxies、EncryptCookies、VerifyCsrfToken などのデフォルトミドルウェアクラスも
app/Http/Middleware/ から削除できます。フレームワーク側に内蔵されているため、カスタマイズが不要ならファイル自体が不要になります。3
コンソールカーネル(app/Console/Kernel.php)を削除する
app/Console/Kernel.php はスケジュールの定義とコマンドの自動ロードを担っていました。旧(app/Console/Kernel.php):app/Console/Commands/ ディレクトリが自動的にスキャンされるため、$this->load()
の記述は不要になりました。スケジュールの定義は routes/console.php または bootstrap/app.php の withSchedule() に移行します。app/Console/Kernel.php を削除します。app/Console/ ディレクトリ内のカスタム Artisan コマンドファイルは削除しないでください。コマンドファイルはそのまま残し、カーネルクラスのファイルだけを削除します。4
例外ハンドラー(app/Exceptions/Handler.php)を削除する
app/Exceptions/Handler.php は例外レポートとレンダリングの設定を担っていました。旧(app/Exceptions/Handler.php):bootstrap/app.php の withExceptions() に移植してから削除します。$dontFlash に独自の項目を追加していた場合は同様に移植できます。app/Exceptions/Handler.php を削除します。5
RouteServiceProvider を削除してルート登録を移行する
app/Providers/RouteServiceProvider.php はルートファイルのロードとレート制限の設定を行っていました。旧(app/Providers/RouteServiceProvider.php):bootstrap/app.php の withRouting() に移行します。AppServiceProvider::boot() に移行します。HOME 定数を使っている箇所がある場合は、直接 URL 文字列に置き換えるか、AppServiceProvider に定数を移動してください。移行後に app/Providers/RouteServiceProvider.php を削除します。6
サービスプロバイダーを整理する
Laravel 10 ではデフォルトで 5 つのサービスプロバイダーが用意されていました。これらを 不要になったプロバイダーファイルを削除したら、さらに、
AppServiceProvider.php 1
つに統合します。削除するプロバイダー(内容を AppServiceProvider に移してから削除):旧(app/Providers/AuthServiceProvider.php)の内容を移行する例:
config/app.php の providers 配列を削除します。bootstrap/providers.php を作成して新構造に対応します。bootstrap/providers.php が存在する場合、Laravel はこちらをプロバイダー一覧として優先して読み込みます。7
コントローラーベースクラスを更新する
Laravel 10 の 新(Laravel 11 以降):トレイトが提供していた機能は次のように置き換えます。
Controller ベースクラスは AuthorizesRequests と ValidatesRequests トレイトを使用していました。Laravel
11 の新しいベースクラスはこれらのトレイトを持たないシンプルな抽象クラスです。旧(Laravel 10):既存のコントローラーがトレイトのメソッドを使っている場合は、各コントローラーを修正するか、トレイトを
Controller
ベースクラスに残すかを選択できます。一度にすべてを変更しなくても動作はします。8
不要なconfigファイルを削除する
config/cors.php、config/hashing.php、config/view.phpなどデフォルトから変更してないファイルは削除できます。変更しているファイルは残してください。9
public/index.phpを更新する
新構造に合わせて変更されているので全面的に書き換えます。
10
artisanを更新する
artisanファイルも同様に全て書き換えます。
11
tests/TestCase.phpを更新する
CreatesApplicationトレイトが不要になっているので変更します。
tests/CreatesApplication.phpは削除して構いません。12
.env .env.example phpunit.xmlを更新する
CACHE_DRIVERからCACHE_STOREに変わったり項目が増えているので必要なら変更します。
この辺りの変更はconfigファイルや本番環境も関わるので慎重に行ってください。
無理に追従する必要はありません。13
動作確認
移行が完了したら、以下の順序で動作確認を行います。問題が発生した場合は、削除したファイルをバックアップから復元し、エラーメッセージを確認してください。