Skip to main content

Laravel 10以前との比較

Laravel 11では「Slim Application Skeleton」として、アプリケーション構造が大幅に刷新されました。最大の変化は、設定の分散をなくし bootstrap/app.php 一か所に集約したことです。
この変更は新規プロジェクト向けです。既存の Laravel 10 アプリケーションをアップグレードしても、古い構造はそのまま動作します。

新しいディレクトリ・ファイル構成

スケルトンのディレクトリ構成

bootstrap/app.php — アプリ設定の中心

このファイル1つで、ルーティング・ミドルウェア・例外ハンドリングを設定できます。Laravel 10 以前では app/Http/Kernel.phpapp/Console/Kernel.phpapp/Exceptions/Handler.php の3ファイルに分散していた設定が、ここに集約されています。

bootstrap/providers.php — サービスプロバイダー一覧

このファイルはサービスプロバイダーの登録先です。Laravel 10 では config/app.phpproviders 配列に記述していましたが、bootstrap/providers.php に分離されました。Laravel 11 のデフォルトでは AppServiceProvider のみです。
composer require でパッケージをインストールすると、そのパッケージが bootstrap/providers.php を自動更新することがあります。config/app.php は参照されなくなったわけではありませんが、新規登録は bootstrap/providers.php が推奨場所になりました。

routes/ ディレクトリの変更

api.phpchannels.php はデフォルトでは存在しません。必要に応じて Artisan コマンドで生成します。
routes/console.php ではスケジュールも定義できます。

廃止されたファイル

HTTP カーネルはフレームワーク内の Illuminate\Foundation\Http\Kernel に統合されました。ミドルウェアのカスタマイズは bootstrap/app.phpwithMiddleware() で行います。
コンソールカーネルの2つの役割が分離されました。Artisanコマンドは app/Console/Commands/ に置き自動検出され、スケジュールは routes/console.php に記述します。
例外ハンドラーはフレームワーク内の Illuminate\Foundation\Exceptions\Handler に統合されました。カスタマイズは bootstrap/app.phpwithExceptions() で行います。

Application::configure() の仕組み

フレームワーク内部での実装

Application::configure()Illuminate\Foundation\Application の静的メソッドです。
このメソッドは次の処理を行います。
  1. basePath からアプリケーションのルートディレクトリを決定する
  2. Application インスタンスを生成する
  3. ApplicationBuilder でラップし、デフォルトの設定を適用する
  4. ApplicationBuilder インスタンスを返す
重要なのは、configure() 内で すでに withKernels() / withEvents() / withCommands() / withProviders() が呼ばれている 点です。bootstrap/app.php でこれらを改めて呼ぶ必要はありません。

メソッドチェーンで設定を行う流れ

create() の呼び出しで ApplicationBuilder から Application インスタンスが取り出され、bootstrap/app.phpreturn するのはこの Application インスタンスです。

リクエストからアプリ起動までの流れ

public/index.php がエントリーポイントとなり、bootstrap/app.php を読み込んで Application を取得します。その後、HTTP Kernel がリクエストをミドルウェアのパイプラインに通し、ルーターがコントローラーにディスパッチします。

ApplicationBuilder の主要メソッド深掘り

withRouting() — ルーティング登録の内部処理

内部では AppRouteServiceProvider::loadRoutesUsing() にコールバックを登録し、アプリケーションの booting 時に AppRouteServiceProvider を登録します。
ポイント:
  • api ルートは api ミドルウェアグループと /api プレフィックスが自動的に適用される
  • health に文字列を渡すとヘルスチェックエンドポイント(デフォルト /up)が自動登録される
  • health のパスはメンテナンスモード中でも除外される(PreventRequestsDuringMaintenance::except() で設定)
  • web より先に api が登録されることに注意。同じパスに対してWebとAPIのルートを定義すると、APIルートが優先される
  • pages に文字列を渡すと Laravel Folio のルーティングが有効になる

withMiddleware() — ミドルウェアカスタマイズ

withMiddleware()HttpKernel が解決されたにコールバックを実行します。これは afterResolving() フックを使っているためです。コールバックに渡される Middleware オブジェクトには豊富なカスタマイズメソッドがあります。

withExceptions() — 例外ハンドリングの設定

withExceptions() はフレームワークの Handler クラスをシングルトンとして登録した上で、コールバックを afterResolving() で設定します。コールバックには Exceptions ラッパーオブジェクトが渡されます。

withProviders() — サービスプロバイダー登録

withProviders()Application::configure() 内でデフォルト呼び出されるため、bootstrap/providers.php は自動的に読み込まれます。追加のプロバイダーを渡したい場合は bootstrap/app.php で明示的に呼ぶ必要があります。
withBootstrapProviders: false を渡すと bootstrap/providers.php が読み込まれなくなります。特別な理由がない限り省略してください。

その他の主要メソッド

設計意図:なぜこうなっているか

「コードファースト」の設定

Laravel 10 以前の app/Http/Kernel.php には配列でミドルウェアを列挙するスタイルが使われていました。これは設定ファイルに近い書き方で、PHPの型システムや IDE のサポートが得られにくいという欠点がありました。 Laravel 11 では withMiddleware(function (Middleware $middleware) { ... }) というコールバックスタイルに変わりました。これにより型補完が効き、条件分岐やループなどのロジックを使った動的な設定が自然に書けます。

「規約より設定」から「明示的な設定」へ

api.php をオプトインにしたのは、APIルートを使わないアプリケーションでも api ミドルウェアグループが常にロードされていたのを解消するためです。使わない機能はデフォルトで存在しない、という方針です。

afterResolving() フックの活用

withMiddleware()withExceptions()afterResolving() を使っているのは、設定の順序問題を避けるためです。ApplicationBuilder のメソッドはアプリケーションが完全に起動する前に呼ばれますが、実際の処理(カーネルへの設定適用)はカーネルが最初に解決されたときに遅延実行されます。

カスタマイズの実践例

APIとWebを共存させる

ミドルウェアのカスタマイズ

スケジュールを bootstrap/app.php に集約する

スケジュールは routes/console.php に書くこともできますが、withSchedule() を使うと bootstrap/app.php にまとめられます。

例外ハンドリングのカスタマイズ

コンテナバインディングを bootstrap/app.php で管理する

小規模なアプリケーションであれば、シンプルなバインディングを AppServiceProvider ではなく bootstrap/app.php に書くこともできます。

Laravelの起動処理の順番

Laravelアプリケーションの起動時、サービスプロバイダーとApplicationのフックは以下の順番で実行されます。
  1. すべてのServiceProviderのregister()実行
  2. Applicationのregistered()
  3. Applicationのbooting()
  4. すべてのServiceProviderのboot()実行
  5. Applicationのbooted()
AppServiceProviderに次のコードを追加すると実行順を確認できます。
ApplicationBuilderregistered()booting()booted()はApplicationにコールバックを登録するだけのメソッドです。通常は使う必要がありませんが、起動準備が完了したKernelに対してbooted()で変更を加えるといった特殊な操作が可能です。

次のステップ

サービスコンテナ

ApplicationBuilder が内部で使っているサービスコンテナの仕組みを理解します。

新アプリ構造 FAQ

新しいアプリケーション構造に関するよくある疑問と回答をまとめています。
最終更新日 2026年5月4日