Skip to content

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.phpmiddleware → 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.phpopt-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 /upk8s/docker healthcheck, диспатчит DiagnosingHealth event
Per-second rate limitingLimit::perSecond(1) — не только perMinute
once() helperмемоизация результата на время request: once(fn () => heavy())
Graceful key rotationAPP_PREVIOUS_KEYS — ротация APP_KEY без разлогина юзеров
Auto password rehashingпри росте BCRYPT_ROUNDS пароли перехешируются при логине
make:class/enum/interface/traitбыстрая генерация не-Laravel классов
Schema introspectionSchema::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'

Внутренняя база знаний студии