株式会社WR

株式会社WR

WEB TOTAL CONSULTING

Laravel 11の新機能——スリムなアプリケーション構造と新しいデフォルト
ブログ一覧へ
技術ブログ

Laravel 11の新機能——スリムなアプリケーション構造と新しいデフォルト

Laravel 11ではアプリケーション構造が大幅にスリム化されました。bootstrap/app.phpの統合・Route ServiceProviderの廃止・最小限のミドルウェアなど、主な変更点を解説します。

Laravel 11の特徴——「スリム化」の哲学

Laravel 11は2024年3月にリリースされ、「必要なものだけを持つ」というコンセプトのもとで、アプリケーション構造が大幅に刷新されました。

Laravel 10以前と比較した主な変更点:

  • app/Http/Kernel.php が廃止
  • app/Console/Kernel.php が廃止
  • app/Exceptions/Handler.php が廃止
  • ServiceProviderの統合(AppServiceProvider 1ファイルに集約)
  • ミドルウェアのデフォルト定義が bootstrap/app.php に移動

新しいアプリケーション構造

app/
├── Http/
│   ├── Controllers/    ← そのまま
│   └── Requests/       ← そのまま
├── Models/             ← そのまま
└── Providers/
    └── AppServiceProvider.php  ← ほぼここだけになった

bootstrap/
└── app.php             ← ミドルウェア・ルーティング・スケジューラーの設定

routes/
├── web.php
├── api.php
└── console.php         ← Artisanコマンドのスケジュールもここに

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',
        api:       __DIR__.'/../routes/api.php',
        commands:  __DIR__.'/../routes/console.php',
        health:    '/up',   // ヘルスチェックエンドポイント
    )
    ->withMiddleware(function (Middleware $middleware) {
        // セッションミドルウェアのカスタマイズ
        $middleware->web(append: [
            \App\Http\Middleware\HandleInertiaRequests::class,
        ]);

        // API認証
        $middleware->api(prepend: [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        ]);

        // エイリアス
        $middleware->alias([
            'role'        => \App\Http\Middleware\CheckRole::class,
            'can-access'  => \App\Http\Middleware\CheckPermission::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        // 例外ハンドリングをここで定義
        $exceptions->renderable(function (\Illuminate\Auth\AuthenticationException $e) {
            if (request()->is('api/*')) {
                return response()->json(['error' => 'Unauthenticated'], 401);
            }
        });

        // 特定の例外をログに記録しない
        $exceptions->dontReport([
            \Illuminate\Auth\AuthenticationException::class,
        ]);
    })
    ->withSchedule(function (\Illuminate\Console\Scheduling\Schedule $schedule) {
        $schedule->command('app:daily-report')->dailyAt('09:00');
    })
    ->create();

ServiceProviderの変化

Laravel 11では AuthServiceProviderEventServiceProviderRouteServiceProvider が廃止され、AppServiceProvider に統合されました。

// app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        // DI コンテナへのバインディング
        $this->app->singleton(PricingService::class);
    }

    public function boot(): void
    {
        // モデルイベント(Observer)
        Order::observe(OrderObserver::class);

        // レート制限
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?? $request->ip());
        });

        // Eloquentモデルのデフォルト設定
        Model::shouldBeStrict(! app()->isProduction());
    }
}

デフォルトの変更

SQLiteがデフォルトDB

新規インストール時のデフォルトDBがSQLiteになりました。開発環境のセットアップが php artisan migrate だけで完了します。

# .env(デフォルト)
DB_CONNECTION=sqlite
# DB_HOST / DB_DATABASE は不要

# PostgreSQLに変更する場合
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=myapp
DB_USERNAME=myuser
DB_PASSWORD=secret

ヘルスチェックエンドポイント

/up エンドポイントが標準で追加され、サーバーのヘルスチェックとして使えます。

curl https://example.com/up
# 200 OK

PHP Artisanコマンドのインライン定義

// routes/console.php
use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();

// Closureで定義もできる
Artisan::command('cache:warm {--force}', function () {
    $this->info('キャッシュをウォームアップ中...');
    // ...
    $this->info('完了');
})->describe('アプリケーションキャッシュをウォームアップ');

モデルのデフォルト変更

遅延ロードが本番以外で禁止

// AppServiceProvider.php
Model::shouldBeStrict(! app()->isProduction());

これにより開発環境ではN+1問題が即座に例外として発覚します。


Laravel 10からの移行

既存のLaravel 10プロジェクトを11に上げる場合、公式アップグレードガイドに従います。主な作業:

  1. composer.json のバージョン更新
  2. Kernel.php 系ファイルの削除
  3. bootstrap/app.php の書き換え
  4. ServiceProviderの統合

まとめ

Laravel 11のスリム化は、新規プロジェクトの立ち上げをシンプルにし、設定ファイルの散在を防ぎます。弊社では新規プロジェクトでLaravel 11を採用し、その開発スピードと保守性の高さを実感しています。

LaravelによるWebシステム開発のご相談はお気軽にどうぞ。

Category 技術ブログ

Related Posts

関連記事

開発・技術のご相談はお気軽に

お見積りは無料です。まずはお気軽にご相談ください。

お問い合わせ →