Laravel 11の特徴——「スリム化」の哲学
Laravel 11は2024年3月にリリースされ、「必要なものだけを持つ」というコンセプトのもとで、アプリケーション構造が大幅に刷新されました。
Laravel 10以前と比較した主な変更点:
app/Http/Kernel.phpが廃止app/Console/Kernel.phpが廃止app/Exceptions/Handler.phpが廃止- ServiceProviderの統合(
AppServiceProvider1ファイルに集約) - ミドルウェアのデフォルト定義が
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では AuthServiceProvider・EventServiceProvider・RouteServiceProvider が廃止され、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に上げる場合、公式アップグレードガイドに従います。主な作業:
composer.jsonのバージョン更新Kernel.php系ファイルの削除bootstrap/app.phpの書き換え- ServiceProviderの統合
まとめ
Laravel 11のスリム化は、新規プロジェクトの立ち上げをシンプルにし、設定ファイルの散在を防ぎます。弊社では新規プロジェクトでLaravel 11を採用し、その開発スピードと保守性の高さを実感しています。
LaravelによるWebシステム開発のご相談はお気軽にどうぞ。