Тема
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, 17.03.2026) — вышел, разбор новинок и практик — в laravel-13.md, обязательные правила — specs/laravel_13/. Security-поддержка L11 закончилась в мар 2026 — проекты на L11 планировать к апгрейду.
Главное изменение 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 |
defer() helper (11.23+) | лёгкая работа после отправки ответа без очереди: defer(fn () => Metrics::log(...)) |
Cache::flexible() (11.23+) | SWR-кеш: отдаёт stale сразу, пересчитывает после ответа (см. performance.md) |
L12 / L13 — что важно знать
- L12 — намеренно «скучный» релиз: апдейт зависимостей + новые starter kits (React/Vue/Svelte/Livewire на Inertia 2 + shadcn/ui / Flux UI). Breeze и Jetstream заморожены.
- L12:
HasUuidsтеперь генерирует UUID v7 (упорядоченные по времени — дружелюбнее к B-tree-индексам PK, меньше page splits, чем v4). - L12: атрибут
#[Scope]для scope-методов без префиксаscopeXxx(см.eloquent-database.md). - L13 (17.03.2026) — минимальный PHP 8.3. Новые проекты — только L13 (багфиксы L12 кончаются 13.08.2026); разбор новинок и апгрейда — laravel-13.md.
- 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' |