Тема
Laravel 11/12 — современная структура приложения
Источник: laravel.com/docs/11.x/releases, /12.x/releases (свериено 2026-05). Версии: L11 (PHP 8.2–8.4, мар 2024) — структурная революция. L12 (PHP 8.2–8.5, фев 2025) — maintenance, почти без breaking changes. L13 (PHP 8.3–8.5, Q1 2026) — вышел. Поддержка L11 security до мар 2026.
Главное изменение L11: streamlined structure
Новые приложения L11+ имеют «тонкую» структуру. Существующие приложения не обязаны мигрировать — старая структура работает. Но новый код пишем в новом стиле.
bootstrap/app.php — единая точка конфигурации
Маршрутизация, middleware, провайдеры, обработка исключений — теперь здесь, а не разбросаны по файлам:
php
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up', // health-check endpoint
)
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(except: ['stripe/*']);
$middleware->web(append: [EnsureUserIsSubscribed::class]);
$middleware->alias(['city' => ResolveCity::class]);
})
->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontReport(MissedFlightException::class);
$exceptions->render(fn (ApiException $e) => response()->json(...));
})->create();Что исчезло из дефолтной структуры
| Было (L10) | Стало (L11+) |
|---|---|
app/Http/Kernel.php | middleware → bootstrap/app.php ->withMiddleware() |
app/Console/Kernel.php | расписание → routes/console.php через Schedule:: фасад |
app/Exceptions/Handler.php | ->withExceptions() в bootstrap/app.php |
| 5 service providers | только AppServiceProvider (остальное — авто или в нём) |
| 9 middleware-классов | внутри фреймворка, кастомизация через bootstrap |
routes/api.php, channels.php | opt-in: php artisan install:api / install:broadcasting |
| ~10 config-файлов | публикуются по требованию: php artisan config:publish |
Важно для проектов: middleware регистрируем в
bootstrap/app.php, НЕ в Kernel.php. Это уже зафиксировано в../controllers.md.
Базовый контроллер упрощён
abstract class Controller {} — больше не наследует internal Controller, нет трейтов AuthorizesRequests/ValidatesRequests. Нужны — подключай в конкретном контроллере.
Eloquent: casts() методом (L11+)
Предпочтительно над свойством $casts (особенно для cast с аргументами):
php
protected function casts(): array
{
return [
'is_active' => 'boolean',
'published_at' => 'datetime',
'meta' => 'array',
'status' => OrderStatus::class, // PHP Enum
'options' => AsCollection::using(OptionCollection::class),
'secret' => AsEncryptedCollection::class,
];
}Свойство $casts всё ещё работает — но для нового кода метод casts() гибче. Правило «cast на каждый non-string столбец» из ../models.md остаётся.
Расписание в routes/console.php
php
use Illuminate\Support\Facades\Schedule;
Schedule::command('sitemap:generate')->daily();
Schedule::command('cache:prune-stale-tags')->hourly();Класс Console/Kernel больше не нужен.
Прочие новинки L11
| Возможность | Применение |
|---|---|
Health route /up | k8s/docker healthcheck, диспатчит DiagnosingHealth event |
| Per-second rate limiting | Limit::perSecond(1) — не только perMinute |
once() helper | мемоизация результата на время request: once(fn () => heavy()) |
| Graceful key rotation | APP_PREVIOUS_KEYS — ротация APP_KEY без разлогина юзеров |
| Auto password rehashing | при росте BCRYPT_ROUNDS пароли перехешируются при логине |
| make:class/enum/interface/trait | быстрая генерация не-Laravel классов |
| Schema introspection | Schema::getColumns(), getIndexes(), getForeignKeys() |
| Dedicated MariaDB driver | лучше дефолты, чем через MySQL-драйвер |
withFakeQueueInteractions() | тест assertReleased/assertDeleted/assertFailed для Job |
L12 / L13 — что важно знать
- L12 — намеренно «скучный» релиз: апдейт зависимостей + новые starter kits (React/Vue/Svelte/Livewire на Inertia 2 + shadcn/ui / Flux UI). Breeze и Jetstream заморожены.
- L13 (Q1 2026) — минимальный PHP 8.3. При старте новых проектов в 2026 — целиться в L12 (стабильный, security до 2027) или L13.
- Laravel официально позиционируется как «clean stack for Artisans and agents» — фреймворк осознанно затачивается под AI-агентов (см. Laravel Boost,
claude-code-workflow.md).
Anti-patterns (L11+)
| Паттерн | Проблема | Решение |
|---|---|---|
Создавать Http/Kernel.php в новом проекте | Устаревшая структура | middleware в bootstrap/app.php |
| Регистрировать всё в 5 провайдерах | Старый подход | один AppServiceProvider + авто-discovery |
$casts свойство для cast с аргументами | Негибко | метод casts() |
Игнорировать /up для healthcheck | Нет мониторинга | прописать health: '/up' |