Skip to main content

はじめに

このガイドでは、Laravel 10 以前の旧アプリケーション構造(Kernel クラスや複数のサービスプロバイダーを持つ構造)から、Laravel 11 以降の Slim Application Skeleton へ移行する手順を解説します。
公式ドキュメントはこの移行を推奨していません。
  • Laravel 10 の旧構造は Laravel 11 以降でもそのまま動作します。Laravel 13 を含む現在のバージョンに至るまで、サポート終了の予定はありません。
  • 移行は完全に任意です。強制でも推奨でもありません。
  • 旧構造と新構造の違いを深く理解していない場合は、移行を避けることを強くお勧めします。フレームワーク内部に精通した開発者向けの作業です。
  • 移行前に必ずバックアップを取り、テストが全て通ることを確認してください。

移行が必要になる場面

以下のような場合に移行を検討することがあります。
  • 新規参加メンバーが公式ドキュメントと照合しやすいように、プロジェクトを最新の標準構造に合わせたい
  • Laravel 11 以降で新規作成したパッケージやスターターキットとの整合性を保ちたい
  • 旧構造由来の設定ファイルやクラスを減らし、コードベースをシンプルにしたい

前提条件

このガイドでは、以下の状態を前提とします。
  • Laravel バージョンアップが完了しているlaravel/framework ^11.0 以降)
  • 既存のテストがすべて通っている
  • Laravel 11 以降のアプリケーション構造(Laravel 11 以降のアプリケーション構造を参照)を理解している

移行例

Laravel 10 + Breeze(Blade スタック)で作成したプロジェクトを Breeze のまま維持しつつ、アプリケーション構造だけを新構造へ移行する手順を示します。
1

bootstrap/app.php を置き換える

bootstrap/app.php$app インスタンスを生成してカーネルを登録する形式でした。これを Application::configure() チェーンに置き換えます。旧(Laravel 10):
新(Laravel 11 以降):
withMiddleware()withExceptions() のコールバックは、次のステップで削除するカーネルファイルの設定を移植する場所です。まずは空のままにして、後続のステップで追記します。
2

HTTP カーネル(app/Http/Kernel.php)を削除する

app/Http/Kernel.php にはグローバルミドルウェア、ミドルウェアグループ、ミドルウェアエイリアスが定義されていました。旧(app/Http/Kernel.php):
Laravel 11 では、上記のミドルウェアはフレームワーク内部にデフォルト値として組み込まれています。カスタマイズがない場合は、app/Http/Kernel.php をそのまま削除できます。カスタマイズがある場合(独自ミドルウェアを追加・除外している場合)は、bootstrap/app.phpwithMiddleware() に移植してから削除してください。
移植が完了したら app/Http/Kernel.php を削除します。
Laravel 11 では TrustProxiesEncryptCookiesVerifyCsrfToken などのデフォルトミドルウェアクラスも app/Http/Middleware/ から削除できます。フレームワーク側に内蔵されているため、カスタマイズが不要ならファイル自体が不要になります。
3

コンソールカーネル(app/Console/Kernel.php)を削除する

app/Console/Kernel.php はスケジュールの定義とコマンドの自動ロードを担っていました。旧(app/Console/Kernel.php):
コマンドの自動ロードは Laravel 11 以降では app/Console/Commands/ ディレクトリが自動的にスキャンされるため、$this->load() の記述は不要になりました。スケジュールの定義routes/console.php または bootstrap/app.phpwithSchedule() に移行します。
移行後に app/Console/Kernel.php を削除します。
app/Console/ ディレクトリ内のカスタム Artisan コマンドファイルは削除しないでください。コマンドファイルはそのまま残し、カーネルクラスのファイルだけを削除します。
4

例外ハンドラー(app/Exceptions/Handler.php)を削除する

app/Exceptions/Handler.php は例外レポートとレンダリングの設定を担っていました。旧(app/Exceptions/Handler.php):
カスタマイズがある場合は bootstrap/app.phpwithExceptions() に移植してから削除します。
$dontFlash に独自の項目を追加していた場合は同様に移植できます。
移植が完了したら app/Exceptions/Handler.php を削除します。
5

RouteServiceProvider を削除してルート登録を移行する

app/Providers/RouteServiceProvider.php はルートファイルのロードとレート制限の設定を行っていました。旧(app/Providers/RouteServiceProvider.php):
ルートファイルの登録bootstrap/app.phpwithRouting() に移行します。
レート制限AppServiceProvider::boot() に移行します。
HOME 定数を使っている箇所がある場合は、直接 URL 文字列に置き換えるか、AppServiceProvider に定数を移動してください。移行後に app/Providers/RouteServiceProvider.php を削除します。
6

サービスプロバイダーを整理する

Laravel 10 ではデフォルトで 5 つのサービスプロバイダーが用意されていました。これらを AppServiceProvider.php 1 つに統合します。削除するプロバイダー(内容を AppServiceProvider に移してから削除):旧(app/Providers/AuthServiceProvider.php)の内容を移行する例:
不要になったプロバイダーファイルを削除したら、config/app.phpproviders 配列を削除します。
さらに、bootstrap/providers.php を作成して新構造に対応します。
bootstrap/providers.php が存在する場合、Laravel はこちらをプロバイダー一覧として優先して読み込みます。
7

コントローラーベースクラスを更新する

Laravel 10 の Controller ベースクラスは AuthorizesRequestsValidatesRequests トレイトを使用していました。Laravel 11 の新しいベースクラスはこれらのトレイトを持たないシンプルな抽象クラスです。旧(Laravel 10):
新(Laravel 11 以降):
トレイトが提供していた機能は次のように置き換えます。既存のコントローラーがトレイトのメソッドを使っている場合は、各コントローラーを修正するか、トレイトを Controller ベースクラスに残すかを選択できます。一度にすべてを変更しなくても動作はします。
Breeze や Jetstream が生成した認証コントローラーが $this->validate()$this->authorize() を呼び出している場合は、ベースクラスを変更する前に必ず動作確認してください。
8

不要なconfigファイルを削除する

config/cors.phpconfig/hashing.phpconfig/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

動作確認

移行が完了したら、以下の順序で動作確認を行います。
問題が発生した場合は、削除したファイルをバックアップから復元し、エラーメッセージを確認してください。

移行後のファイル構成

移行後のプロジェクトは、以下のような構成になります(旧構造からの変更点を示す)。

まとめ

参考リンク

最終更新日 2026年5月3日