PHPの代表的フレームワークであるLaravelは、バージョン Laravel 11 において、アプリケーションの骨格(Skeleton)を大幅にシンプル化する歴史的なリファクタリングを実施しました。
これまで長年親しまれてきた app/Http/Kernel.php や app/Console/Kernel.php、app/Exceptions/Handler.php が廃止され、設定やルーティング、ミドルウェアの登録が bootstrap/app.php へ一元集約 されるなど、開発者が日々触るファイル構成が劇的にスリム化されています。
- Laravel 11の全体像と設計思想(なぜスリム化されたのか?)
- Laravel 10とLaravel 11のディレクトリ構造比較(廃止されたファイル・残ったファイル)
- 新しい設定の心臓部
bootstrap/app.phpの書き方とフルエント設定構文 - ミドルウェアの登録方法(エイリアス・グローバル・除外設定)の完全解説
- ルーティングの変更点(
routes/api.phpのオンデマンド生成・routes/console.phpのスケジュール統合) - 例外処理(Exception Handler)の新しいカスタマイズ手順
- 設定ファイル(
config/)のオンデマンド公開(php artisan config:publish) - Eloquentモデルの
casts()メソッド構文とメリット - SQLite WALモード・MariaDB公式サポート・Dumpableトレイトなどの注目新機能
- Laravel 10からの安全なアップグレード手順と後方互換性
「Laravel 11で新規プロジェクトを作成したらフォルダが少なくて戸惑った」「ミドルウェアや例外処理をどこに書けばいいかわからない」「Laravel 10からの移行ポイントを押さえたい」という方に向けて、変更点を実例コード付きでわかりやすく網羅解説します。
—
- 1. Laravel 11の主要な変更点まとめ一覧【早見表】
- 2. 刷新されたスリムなディレクトリ構造の全貌
- 3. 設定の心臓部:bootstrap/app.php の全体像
- 4. ミドルウェアの登録・設定方法の変更点
- 5. ルーティングの変更点(API・Console・スケジュール)
- 6. 例外処理(Exception Handling)のカスタマイズ
- 7. 設定ファイル(config/)のオンデマンド公開
- 8. Eloquentモデルの変更点:casts() メソッド構文
- 9. その他の注目新機能・開発効率化アップデート
- 10. Laravel 10からLaravel 11への安全な移行・アップグレード手順
- 11. よくある質問(FAQ)
- 12. 関連記事・あわせて読みたいLaravel実践ガイド
- 13. まとめ:スリムになったLaravel 11で快適な開発を体験しよう
- 関連記事
1. Laravel 11の主要な変更点まとめ一覧【早見表】
まずは、Laravel 11で何がどのように変わったのか、主要な変更ポイントを一覧表で把握しましょう。
| カテゴリ | Laravel 10 以前 | Laravel 11 |
|---|---|---|
| PHP必須バージョン | PHP 8.1 以上 | PHP 8.2 / 8.3 以上 |
| Kernelクラス | app/Http/Kernel.phpapp/Console/Kernel.php |
完全廃止(bootstrap/app.php に集約) |
| 例外ハンドラ | app/Exceptions/Handler.php |
完全廃止(bootstrap/app.php に集約) |
| ミドルウェア配置 | app/Http/Middleware/ に9個以上のデフォルトクラス |
フレームワーク内部に内包(ディレクトリは初期空) |
| ルーティングファイル | web.php, api.php, console.php, channels.php |
デフォルトは web.php と console.php のみ(API/BroadcastはArtisanで導入) |
| 設定ファイル群 | config/ 配下に約15個のPHPファイルが初期配置 |
初期状態はほぼ空(必要な設定のみ config:publish で生成) |
| サービスプロバイダ | Auth, Event, Route 等5個以上のプロバイダ |
AppServiceProvider.php のみ |
| Eloquent Casts | protected $casts = [...];(プロパティ) |
protected function casts(): array(メソッド) |
| 初期データベース | MySQL 設定がデフォルト(.envで変更) | SQLite(WALモード)が標準デフォルト |
| ヘルスチェック | 手動でルートまたはパッケージ導入 | /up エンドポイントが標準ビルトイン |
—
2. 刷新されたスリムなディレクトリ構造の全貌
Laravel 11の最大の特徴は、「ボイラープレート(定型コード)を徹底的に削ぎ落としたスリムなスケルトン」 です。
Laravel 10 と Laravel 11 のディレクトリ構造比較
| Laravel 10 以前の構造(ファイル多数) | Laravel 11 の構造(超スリム)🌟 |
|---|---|
|
app/ ├── Console/ │ └── Kernel.php ❌ ├── Exceptions/ │ └── Handler.php ❌ ├── Http/ │ ├── Controllers/ │ ├── Middleware/ ❌ │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ └── Kernel.php ❌ ├── Models/ └── Providers/ ├── AppServiceProvider.php ├── AuthServiceProvider.php ❌ ├── BroadcastServiceProvider.php ❌ ├── EventServiceProvider.php ❌ └── RouteServiceProvider.php ❌ config/ (15+ ファイル) ❌ routes/ ├── web.php ├── api.php ❌ ├── console.php └── channels.php ❌ |
app/ ├── Http/ │ └── Controllers/ │ └── Controller.php ├── Models/ │ └── User.php └── Providers/ └── AppServiceProvider.php bootstrap/ config/ (初期状態は空・必要時のみ生成) |
Laravel 10までは、フレームワークを新規インストールした時点で「カスタマイズするかどうかわからない数十個のファイル」が配置されていました。Laravel 11では、「デフォルトの挙動はフレームワーク内部が安全に受け持ち、開発者がカスタマイズしたい部分だけを
bootstrap/app.php や専用コマンドで宣言する」という設計思想にシフトしました。これにより、初心者にとっての見通しの良さと、プロ向けの高い柔軟性が両立されています。
—
3. 設定の心臓部:bootstrap/app.php の全体像
Laravel 11のアプリケーション設定は、すべて bootstrap/app.php のフルエント(流れるような)インターフェースに集約されています。
新規作成時のデフォルトコード
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// ミドルウェアの追加・カスタマイズをここに記述
})
->withExceptions(function (Exceptions $exceptions) {
// 例外ハンドリングのカスタマイズをここに記述
})->create();
bootstrap/app.php の3大チェーンメソッド
withRouting():Webルート、Consoleルート、APIルート、Healthチェックルートの登録を行います。withMiddleware():グローバルミドルウェア、ミドルウェアグループ(web/api)、ルートエイリアス、CSRFやCookie暗号化の除外設定を行います(旧app/Http/Kernel.phpの代替)。withExceptions():カスタム例外の描画(renderable)、ログ報告制御(reportable)、HTTPエラー応答のカスタマイズを行います(旧app/Exceptions/Handler.phpの代替)。
/up):health: '/up' が定義されているため、ブラウザやAWS ALB、Kubernetes、Uptime Robot等から https://your-domain.com/up にアクセスするだけで、アプリケーションが稼働中であれば HTTP 200 OK(背景緑のステータス画面)が自動返却されます。自前でヘルスチェック用コントローラを作成する必要がなくなりました。
—
4. ミドルウェアの登録・設定方法の変更点
Laravel 10までは app/Http/Kernel.php に配列として定義していたミドルウェア設定は、すべて bootstrap/app.php の withMiddleware() クロージャ内で行います。
① ルートミドルウェアのエイリアス(別名)登録
コントローラやルート定義で ->middleware('admin') のように名前で指定したいカスタムミドルウェアは、$middleware->alias() で登録します。
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'subscribed' => \App\Http\Middleware\EnsureUserIsSubscribed::class,
]);
})
② グローバルミドルウェアの追加(append / prepend)
すべてのHTTPリクエストで必ず実行させたいミドルウェアは、末尾に追加する append() または先頭に追加する prepend() を使用します。
->withMiddleware(function (Middleware $middleware) {
// 全リクエストの最後に実行
$middleware->append(\App\Http\Middleware\LogHttpActivity::class);
// 全リクエストの最初に実行
$middleware->prepend(\App\Http\Middleware\CheckMaintenanceMode::class);
})
③ web / api ミドルウェアグループのカスタマイズ
特定のグループ(web または api)にのみミドルウェアを追加・削除する場合の書き方です。
->withMiddleware(function (Middleware $middleware) {
// webグループの末尾に追加
$middleware->web(append: [
\App\Http\Middleware\CustomSessionTracker::class,
]);
// apiグループから特定のミドルウェアを削除
$middleware->api(remove: [
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
})
④ 未ログイン時・ログイン済みのリダイレクト先設定
旧 Authenticate.php や RedirectIfAuthenticated.php で行っていた「未認証時の遷移先」「ログイン済み時の遷移先」は、1行で直感的に設定できます。
->withMiddleware(function (Middleware $middleware) {
$middleware->redirectTo(
guests: '/login', // 未ログインユーザーが保護ルートにアクセスした時
users: '/dashboard' // ログイン済みユーザーがゲスト専用ルート(/login等)にアクセスした時
);
})
⑤ CSRF検証の除外(validateCsrfTokens)
Webhookや外部決済連携(Stripe, PayPal, LINE Pay等)でCSRF保護をスキップしたいパスは、validateCsrfTokens() の except で指定します(旧 VerifyCsrfToken.php の代替)。
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: [
'stripe/*',
'webhooks/github',
'api/external/*',
]);
})
⑥ Cookie暗号化の除外(encryptCookies)
->withMiddleware(function (Middleware $middleware) {
$middleware->encryptCookies(except: [
'visitor_analytics_token',
]);
})
カスタムミドルウェアの新規作成コマンド
カスタムミドルウェアが必要になった場合は、従来通り以下のArtisanコマンドを実行すると app/Http/Middleware/ ディレクトリとクラスが自動生成されます。
php artisan make:middleware AdminMiddleware
—
5. ルーティングの変更点(API・Console・スケジュール)
Laravel 11では、デフォルトのルーティングファイルが最小限に抑えられています。
① APIルーティングの有効化:install:api
新規インストール直後の routes/ ディレクトリには routes/api.php が存在しません。APIエンドポイントを構築する場合は、以下のArtisanコマンドを実行します。
php artisan install:api
install:api コマンドが実行する自動処理:
routes/api.phpファイルを作成bootstrap/app.phpのwithRouting()にapi: __DIR__.'/../routes/api.php'を自動追記- APIトークン認証パッケージ Laravel Sanctum のインストールとマイグレーションの準備
② ブロードキャストの有効化:install:broadcasting
WebSocketやPusher等のリアルタイム通信機能が必要な場合は、以下のコマンドで routes/channels.php とLaravel Reverb/Pusherの設定をセットアップします。
php artisan install:broadcasting
③ タスクスケジュールの定義が routes/console.php に統合!
app/Console/Kernel.php が廃止されたため、定期実行バッチ(Cronスケジュール)は routes/console.php に直接記述するシンプルなスタイルになりました。
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;
// Artisanコマンドのクロージャ定義
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
// タスクスケジュールの定義(Scheduleファサードを使用)
Schedule::command('emails:send-reminders')->dailyAt('09:00');
Schedule::command('queue:prune-failed --hours=48')->daily();
Schedule::command('backup:clean')->weeklyOn(1, '02:00');
—
6. 例外処理(Exception Handling)のカスタマイズ
旧 app/Exceptions/Handler.php の register() メソッドに書いていた例外ハンドリングは、bootstrap/app.php の withExceptions() で定義します。
カスタム例外の描画(renderable)
特定の例外が発生した際に独自のJSONレスポンスやエラー画面を返したい場合の書き方です。
use App\Exceptions\PaymentFailedException;
use Illuminate\Http\Request;
->withExceptions(function (Exceptions $exceptions) {
// 独自例外発生時のカスタムレスポンス
$exceptions->render(function (PaymentFailedException $e, Request $request) {
if ($request->is('api/*')) {
return response()->json([
'success' => false,
'message' => '決済処理に失敗しました。カード情報をご確認ください。',
'error_code' => $e->getCode(),
], 402);
}
return response()->view('errors.payment-failed', ['error' => $e->getMessage()], 402);
});
})
ログ通知・レポートの制御(report / dontReport)
use App\Exceptions\IgnorableBusinessException;
->withExceptions(function (Exceptions $exceptions) {
// ログ出力から除外する例外クラス
$exceptions->dontReport([
IgnorableBusinessException::class,
]);
// 致命的エラー時の外部通知(SlackやSentry等)
$exceptions->report(function (\Throwable $e) {
if ($e instanceof \FatalThrowableError) {
// Slack通知などのカスタムロジック
}
});
})
—
7. 設定ファイル(config/)のオンデマンド公開
Laravel 11では、新規インストール時に config/ ディレクトリ内がほぼ空になっています。
カスケード設定(フレームワークデフォルト)の仕組み
Laravel 11は、フレームワーク内部に各コンポーネント(app, database, auth, mail, logging等)のデフォルト設定を保持しています。そのため、.env に環境変数を設定するだけでほとんどの機能は設定ファイルなしで正常に動作します。
設定ファイルをカスタマイズしたい時:config:publish
詳細なドライバ設定や独自オプションを変更したい場合のみ、php artisan config:publish コマンドで対象の設定ファイルを config/ 配下に生成(公開)します。
# 特定の設定ファイルを公開する(例: database.php)
php artisan config:publish database
# メール設定を公開する
php artisan config:publish mail
# CORS設定を公開する
php artisan config:publish cors
# すべての設定ファイルを一括公開する(Laravel 10以前と同じ状態にしたい場合)
php artisan config:publish --all
| 公開コマンド | 生成されるファイル | 主な用途 |
|---|---|---|
config:publish database |
config/database.php |
複数DB接続・レプリケーション・Redisクラスター設定 |
config:publish auth |
config/auth.php |
カスタム認証ガード・パスワードリセット有効期限 |
config:publish logging |
config/logging.php |
Slack通知ログチャンネル・Papertrail等の外部ログ連携 |
config:publish cors |
config/cors.php |
フロントエンドSPAとのクロスオリジン許可ドメイン設定 |
—
8. Eloquentモデルの変更点:casts() メソッド構文
Eloquentモデルの属性キャスト定義が、従来の $casts プロパティから protected function casts(): array メソッド に進化しました。
従来のプロパティ構文 vs 新しいメソッド構文
// 【Laravel 10以前】プロパティ構文
class User extends Authenticatable
{
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'is_admin' => 'boolean',
];
}
// 【Laravel 11以降】メソッド構文 🌟
class User extends Authenticatable
{
/**
* モデルの属性キャスト定義
*
* @return array
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'is_admin' => 'boolean',
'status' => UserStatus::class, // Enumクラスの直接指定
'options' => AsArrayObject::class,
];
}
}
casts() メソッド化の3大メリット
- 動的メソッドや静的呼び出しが可能:静的プロパティではできなかった関数呼び出しや動的評価が可能になります。
- Enumやカスタムキャストへの引数受け渡しが容易:PHPの型補完や静的解析ツール(PHPStan/Psalm)との親和性が大幅に向上します。
- 後方互換性の維持:Laravel 11でも従来の
protected $casts = [...];プロパティは引き続き動作するため、既存コードが一気に壊れる心配はありません。
—
9. その他の注目新機能・開発効率化アップデート
① デフォルトデータベースが SQLite(WALモード)に
新規Laravel 11プロジェクトでは、.env の DB_CONNECTION 初期値が sqlite になっています。さらに高速な WAL(Write-Ahead Logging)モード がデフォルトで有効化されており、並行アクセス時のパフォーマンスが向上しています。
DockerやMySQLサーバーを立ち上げることなく、composer create-project 後に即座に php artisan migrate して開発を始められます。
② MariaDBドライバ(mariadb)の公式サポート
これまでMySQLドライバを流用していたMariaDB向けに、専用の mariadb データベースドライバが追加されました。
DB_CONNECTION=mariadb
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_db
DB_USERNAME=root
DB_PASSWORD=
③ 暗号化キーの安全なローテーション(APP_PREVIOUS_KEYS)
本番環境で APP_KEY を定期更新する際、古いキーで暗号化されたCookieやセッション、暗号化カラムが復号できなくなる問題を解決するため、.env に過去のキーをカンマ区切りで保持できるようになりました。
APP_KEY=base64:新しい暗号化キー...
APP_PREVIOUS_KEYS=base64:1世代前のキー...,base64:2世代前のキー...
④ Dumpableトレイトの全面導入
Laravelの多くのクラス(Carbon, Collection, Http Client, TestResponse 等)に Dumpable トレイトが実装され、メソッドチェーンの途中で ->dump() や ->dd() を呼び出せるようになりました。
// メソッドチェーンの途中で中身を確認できる
$response = Http::withHeaders(['X-Token' => 'abc'])
->dump() // リクエスト内容をダンプ出力して処理継続
->post('https://api.example.com/data');
⑤ 新規クラス生成Artisanコマンドの拡充
php artisan make:class Services/PaymentService # 通常のクラスを生成
php artisan make:enum Enums/UserRole # Enumクラスを生成
php artisan make:interface Contracts/PaymentGateway # インターフェースを生成
php artisan make:trait Traits/Sluggable # トレイトを生成
⑥ 秒単位のレート制限(Per-second Rate Limiting)
APIなどの過負荷対策として、分単位だけでなく秒単位でのリクエスト制限が可能になりました。
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Cache\RateLimiting\Limit;
RateLimiter::for('api', function (Request $request) {
// 1秒間に最大5リクエストまで許可
return Limit::perSecond(5)->by($request->user()?->id ?: $request->ip());
});
—
10. Laravel 10からLaravel 11への安全な移行・アップグレード手順
既存のLaravel 10プロジェクトをLaravel 11へアップグレードする手順と注意点です。
ステップ①:環境要件の確認
- PHP 8.2 または PHP 8.3 以上 にサーバー・ローカル環境を更新します。
- Composer 2.2.0 以上を用意します。
ステップ②:composer.json の依存関係を更新
{
"require": {
"php": "^8.2",
"laravel/framework": "^11.0",
"laravel/sanctum": "^4.0",
"laravel/tinker": "^2.9",
"nunomaduro/collision": "^8.1"
},
"require-dev": {
"larastan/larastan": "^2.9",
"phpunit/phpunit": "^10.5"
}
}
更新後、以下のコマンドでパッケージを更新します。
composer update
ステップ③:ディレクトリ構造はLaravel 10のままでOK?
Laravel 11は完全な後方互換性を備えています。既存プロジェクトに
app/Http/Kernel.php や config/*.php が残っていても、Laravel 11上で何の問題もなく動作します。新構造(スリムSkeleton)への移行は、プロジェクトの規模やスケジュールに合わせて段階的に行うか、自動移行ツール Laravel Shift を利用するのがおすすめです。
—
11. よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
Q: routes/api.php が見当たりません。消えたのですか? |
初期状態では配置されていません。php artisan install:api コマンドを実行すると、ファイル作成とルーティング設定、Sanctumのセットアップが一括で行われます。 |
Q: config/ ディレクトリに設定ファイルがありません。どう編集すればいいですか? |
編集したい設定ファイルのみ php artisan config:publish database のように個別公開するか、php artisan config:publish --all で一括公開して編集できます。 |
Q: モデルの $casts プロパティは使えなくなりますか? |
いいえ、従来の protected $casts = [...]; プロパティも後方互換性により引き続き動作します。新規作成時はより柔軟な casts() メソッド構文が推奨されます。 |
| Q: タスクスケジュールはどこに書けばいいですか? | routes/console.php に Schedule::command(...)->daily(); のように記述します。app/Console/Kernel.php は不要です。 |
—
公式AI SDK(
laravel/ai)統合やReact 19・Vue 3・Svelte対応の新スターターキット、Carbon 3への移行など最新の進化は Laravel 12の新機能・変更点総まとめ|公式AI SDK統合・最新スターターキットとLaravel 11からのアップグレード手順 で詳しく解説しています!
12. 関連記事・あわせて読みたいLaravel実践ガイド
Laravelの基礎から応用、実務テクニックをさらに深めるための関連記事です。ぜひあわせて参考にしてください。
- 🔍 Laravelのバージョン確認方法まとめ!コマンド・composer.lock・PHPコードでの確認手順を徹底解説
お使いの環境のLaravelやPHPのバージョンを瞬時に確認する実践テクニックです。 - 🔐 Laravel Sanctum完全攻略|SPA認証(Cookie)とAPIトークン認証(Bearer)の実装手順を徹底解説
Laravel 11のphp artisan install:apiで自動導入されるSanctumを用いた安全なAPI認証ガイドです。 - 🛡️ Laravel認証の違いを徹底比較!Breeze・Sanctum・Jetstream・Fortifyの選び方とおすすめ
Laravel 11における認証スターターキットの選び方と各パッケージの特徴比較です。 - ⚡ Laravel キュー(Queue)と非同期処理の実装完全ガイド|database設定・Job作成・dispatchからワーカー常駐まで徹底解説
重い処理をバックグラウンド化して高速レスポンスを実現するキュー・Jobの完全解説です。 - 📧 Laravelメール送信完全ガイド|Mailableの使い方とBladeテンプレート・Mailpit/Mailtrapでの検証手順を徹底解説
Laravelのメール送信機能とMailpitを用いたローカル開発手法です。 - 🔒 Laravel GateとPolicyの違いと使い分け完全ガイド|認可(権限管理)の基本からBlade・Controllerでの判定方法まで徹底解説
AuthServiceProvider廃止後のGate・Policyの登録方法と権限管理設計です。 - 📝 Laravel バリデーション日本語化完全ガイド|lang/ja/validation.php導入とattributes(項目名)設定・カスタマイズ手順
フォームエラーメッセージの日本語化と多言語対応の完全手順です。 - 🔄 Laravel Eloquentリレーション全種類まとめ|hasMany・belongsToの違いと正しい定義方法を徹底解説
モデル間のリレーション定義とcasts()メソッドの活用法です。
—
13. まとめ:スリムになったLaravel 11で快適な開発を体験しよう
Laravel 11は、不要なボイラープレートを排除し、コードの見通しと開発者体験(DX)を飛躍的に向上させた素晴らしいメジャーバージョンです。
- 設定やミドルウェアの登録は
bootstrap/app.phpで行う - API構築時は
php artisan install:apiを実行する - タスクスケジュールは
routes/console.phpに記述する - モデルの型キャストは
protected function casts(): arrayを活用する - 設定を変更したい時は
php artisan config:publishを利用する - 標準搭載の
/upで手軽にヘルスチェックを行う
洗練されたLaravel 11の機能をフル活用して、保守性が高くスピーディなWebアプリケーション開発を進めていきましょう!

コメント