はじめに
このガイドでは、Laravel 10 以前の旧アプリケーション構造(Kernel クラスや複数のサービスプロバイダーを持つ構造)から、Laravel 11 以降の Slim Application Skeleton へ移行する手順を解説します。
移行が必要になる場面
以下のような場合に移行を検討することがあります。- 新規参加メンバーが公式ドキュメントと照合しやすいように、プロジェクトを最新の標準構造に合わせたい
- Laravel 11 以降で新規作成したパッケージやスターターキットとの整合性を保ちたい
- 旧構造由来の設定ファイルやクラスを減らし、コードベースをシンプルにしたい
前提条件
このガイドでは、以下の状態を前提とします。- Laravel バージョンアップが完了している(
laravel/framework ^11.0以降) - 既存のテストがすべて通っている
- Laravel 11 以降のアプリケーション構造(Laravel 11 以降のアプリケーション構造を参照)を理解している
移行例
Laravel 10 + Breeze(Blade スタック)で作成したプロジェクトを Breeze のまま維持しつつ、アプリケーション構造だけを新構造へ移行する手順を示します。bootstrap/app.php を置き換える
旧 新(Laravel 11 以降):
bootstrap/app.php は $app インスタンスを生成してカーネルを登録する形式でした。これを
Application::configure() チェーンに置き換えます。旧(Laravel 10):withMiddleware() と withExceptions() のコールバックは、次のステップで削除するカーネルファイルの設定を移植する場所です。まずは空のままにして、後続のステップで追記します。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/ から削除できます。フレームワーク側に内蔵されているため、カスタマイズが不要ならファイル自体が不要になります。コンソールカーネル(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 コマンドファイルは削除しないでください。コマンドファイルはそのまま残し、カーネルクラスのファイルだけを削除します。例外ハンドラー(app/Exceptions/Handler.php)を削除する
app/Exceptions/Handler.php は例外レポートとレンダリングの設定を担っていました。旧(app/Exceptions/Handler.php):bootstrap/app.php の withExceptions() に移植してから削除します。$dontFlash に独自の項目を追加していた場合は同様に移植できます。app/Exceptions/Handler.php を削除します。RouteServiceProvider を削除してルート登録を移行する
app/Providers/RouteServiceProvider.php はルートファイルのロードとレート制限の設定を行っていました。旧(app/Providers/RouteServiceProvider.php):bootstrap/app.php の withRouting() に移行します。AppServiceProvider::boot() に移行します。HOME 定数を使っている箇所がある場合は、直接 URL 文字列に置き換えるか、AppServiceProvider に定数を移動してください。移行後に app/Providers/RouteServiceProvider.php を削除します。サービスプロバイダーを整理する
Laravel 10 ではデフォルトで 5 つのサービスプロバイダーが用意されていました。これらを
旧(app/Providers/AuthServiceProvider.php)の内容を移行する例:不要になったプロバイダーファイルを削除したら、さらに、
AppServiceProvider.php 1
つに統合します。削除するプロバイダー(内容を AppServiceProvider に移してから削除):| ファイル | 移行先 |
|---|---|
app/Providers/AuthServiceProvider.php | AppServiceProvider::boot() の Gate::policy() 等 |
app/Providers/BroadcastServiceProvider.php | Broadcasting を使う場合は bootstrap/app.php の withBroadcasting() |
app/Providers/EventServiceProvider.php | AppServiceProvider::boot() の Event::listen() 等 |
app/Providers/RouteServiceProvider.php | 前のステップで対応済み |
config/app.php の providers 配列を削除します。bootstrap/providers.php を作成して新構造に対応します。bootstrap/providers.php が存在する場合、Laravel はこちらをプロバイダー一覧として優先して読み込みます。コントローラーベースクラスを更新する
Laravel 10 の 新(Laravel 11 以降):トレイトが提供していた機能は次のように置き換えます。
既存のコントローラーがトレイトのメソッドを使っている場合は、各コントローラーを修正するか、トレイトを
Controller ベースクラスは AuthorizesRequests と ValidatesRequests トレイトを使用していました。Laravel
11 の新しいベースクラスはこれらのトレイトを持たないシンプルな抽象クラスです。旧(Laravel 10):| 旧の方法(トレイト経由) | 新の方法 |
|---|---|
$this->validate($request, $rules) | $request->validate($rules) |
$this->authorize('update', $post) | Gate::authorize('update', $post) |
$this->authorizeResource(Post::class) | Laravel11では簡単な代替手段はないのでApp\Http\Controllers\ControllerをLaravel10仕様のままにします |
Controller
ベースクラスに残すかを選択できます。一度にすべてを変更しなくても動作はします。不要なconfigファイルを削除する
config/cors.php、config/hashing.php、config/view.phpなどデフォルトから変更してないファイルは削除できます。変更しているファイルは残してください。tests/TestCase.phpを更新する
CreatesApplicationトレイトが不要になっているので変更します。
tests/CreatesApplication.phpは削除して構いません。.env .env.example phpunit.xmlを更新する
CACHE_DRIVERからCACHE_STOREに変わったり項目が増えているので必要なら変更します。
この辺りの変更はconfigファイルや本番環境も関わるので慎重に行ってください。
無理に追従する必要はありません。移行後のファイル構成
移行後のプロジェクトは、以下のような構成になります(旧構造からの変更点を示す)。まとめ
| 移行内容 | 旧の場所 | 新の場所 |
|---|---|---|
| HTTP ミドルウェア | app/Http/Kernel.php | bootstrap/app.php の withMiddleware() |
| 例外ハンドリング | app/Exceptions/Handler.php | bootstrap/app.php の withExceptions() |
| スケジュール定義 | app/Console/Kernel.php | routes/console.php |
| ルート登録 | app/Providers/RouteServiceProvider.php | bootstrap/app.php の withRouting() |
| サービスプロバイダー一覧 | config/app.php の providers 配列 | bootstrap/providers.php |
| ポリシー登録 | app/Providers/AuthServiceProvider.php | 自動登録。AppServiceProvider::boot()で手動登録 |
| イベントリスナー | app/Providers/EventServiceProvider.php | 自動登録。AppServiceProvider::boot()で手動登録 |