<? phpukraine ЕКОСИСТЕМА
⌕Пошук по платформі
LARAVEL · ЩО НОВОГО

Що нового в Laravel 11

  1. 01Новий скелет: маршрути, middleware і винятки налаштовуються в bootstrap/app.php, без Kernel-класів.
  2. 02Laravel Reverb для WebSocket, ліміти по секундах і вбудований health-маршрут /up.
  3. 03Метод casts() у моделях, хелпер once(), тести взаємодії з чергою та плавна ротація APP_KEY.
СТАТУС Не підтримується
Реліз
12 березня 2024
Останній патч
11.57.0
Активна підтримка до
03.09.2025
Безпека до
12.03.2026
НОВІ МОЖЛИВОСТІ · 11

Нові можливості

1.1 · ЗМІНА

bootstrap/app.php замість Kernel

Налаштування застосунку були розкидані по HTTP Kernel, Console Kernel, Exceptions\Handler і пʼяти сервіс-провайдерах. У новому скелеті все це зібрано в bootstrap/app.php: ланцюжок Application::configure() підключає маршрути, middleware й обробку винятків, а з провайдерів лишився один AppServiceProvider. Проєкти, оновлені з 10.x, можуть спокійно жити зі старою структурою.

+ LARAVEL 11
// bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->report(function (InvalidOrderException $e) {
            // ...
        });
    })->create();
− LARAVEL 10
// app/Exceptions/Handler.php
public function register(): void
{
    $this->reportable(function (InvalidOrderException $e) {
        // ...
    });
}
1.2 · ЗМІНА

Middleware без HTTP Kernel

Девʼять middleware, які раніше копіювались у кожен новий проєкт, переїхали у фреймворк. Щоб виключити маршрут із перевірки CSRF чи додати свій клас до групи web, більше не треба тримати клас-нащадок або правити Kernel. Для цього є методи обʼєкта Middleware.

+ LARAVEL 11
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'stripe/*',
    ]);

    $middleware->web(append: [
        EnsureUserIsSubscribed::class,
    ]);
})
− LARAVEL 10
// app/Http/Middleware/VerifyCsrfToken.php
class VerifyCsrfToken extends Middleware
{
    protected $except = [
        'stripe/*',
    ];
}
1.3 · ЗМІНА

Розклад у routes/console.php

Консольного Kernel у новому скелеті немає, тому задачі за розкладом описуються фасадом Schedule прямо в routes/console.php, поруч із closure-командами. Методи розкладу ті самі, змінилося лише місце.

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

Schedule::command('emails:send')->daily();
− LARAVEL 10
// app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
    $schedule->command('emails:send')->daily();
}
1.4 · ЗМІНА

API і broadcasting на вимогу

Багатьом застосункам API та broadcasting не потрібні, тож нові проєкти стартують без цих файлів. Команда install:api створює routes/api.php з префіксом /api і ставить Sanctum. Для каналів є install:broadcasting, яка заодно пропонує встановити Reverb.

+ LARAVEL 11
// php artisan install:api створює routes/api.php
Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');
1.5 · ПАКЕТ

Laravel Reverb

Для подій у реальному часі можна обійтися без Pusher чи іншого стороннього сервісу. Reverb працює з Laravel Echo і наявними інструментами broadcasting, а під навантаженням масштабується на кілька серверів через Redis pub/sub.

+ LARAVEL 11
php artisan install:broadcasting
php artisan reverb:start
1.6 · НОВЕ

Health-маршрут /up

Перевірку «чи живий застосунок» більше не треба писати самому. GET /up відповідає 200, якщо застосунок завантажився без винятків, і 500, якщо ні. На кожен такий запит Laravel диспатчить подію DiagnosingHealth, тож у слухачі можна перевірити базу чи кеш і кинути виняток, коли щось не так.

+ LARAVEL 11
use Illuminate\Foundation\Events\DiagnosingHealth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Event;

Event::listen(function (DiagnosingHealth $event) {
    // якщо база недоступна, /up віддасть 500
    DB::connection()->getPdo();
});
1.7 · НОВЕ

Rate limiting по секундах

Найменшим вікном лімітера була хвилина, і 60 запитів за хвилину клієнт міг витратити одним сплеском. Тепер усі лімітери, зокрема для маршрутів і задач у черзі, рахують час у секундах, тож навантаження легко розподілити рівніше.

+ LARAVEL 11
RateLimiter::for('invoices', function (Request $request) {
    return Limit::perSecond(1);
});
− LARAVEL 10
RateLimiter::for('invoices', function (Request $request) {
    return Limit::perMinute(60);
});
1.8 · НОВЕ

Тести взаємодії з чергою

Щоб протестувати release(), delete() чи fail() усередині задачі, раніше доводилося писати власні фейки й заглушки черги. Тепер достатньо викликати withFakeQueueInteractions(), запустити handle() і перевірити результат через assertReleased(), assertDeleted() або assertFailed().

+ LARAVEL 11
use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);
1.9 · НОВЕ

Валідатор Laravel у Prompts

Laravel Prompts перевіряв введення через closure, і для кількох полів зі складними умовами це швидко ставало громіздким. У Laravel 11 параметр validate приймає правила валідатора, ті самі, що й у формах.

+ LARAVEL 11
$name = text('Як вас звати?', validate: [
    'name' => 'required|min:3|max:255',
]);
− LARAVEL 10
$name = text(
    label: 'Як вас звати?',
    validate: fn (string $value) => match (true) {
        strlen($value) < 3 => 'Мінімум 3 символи.',
        strlen($value) > 255 => 'Максимум 255 символів.',
        default => null
    }
);
1.10 · НОВЕ

make:class, make:enum, make:interface, make:trait

Artisan давно генерував контролери й моделі, а простий клас чи enum доводилося створювати руками. Чотири нові команди закривають цю прогалину. make:enum з опцією --string або --int створює backed enum і кладе його в app/Enums, якщо така тека вже є.

+ LARAVEL 11
php artisan make:class Services/InvoiceService
php artisan make:enum OrderStatus --string
php artisan make:interface Contracts/PaymentGateway
php artisan make:trait Concerns/HasSlug
1.11 · ЗМІНА

SQLite і драйвер database за замовчуванням

Свіжий застосунок працює на SQLite, а сесії, кеш і черга використовують драйвер database. Можна одразу писати код, нічого не встановлюючи і не створюючи додаткових міграцій. Команда Laravel вважає ці драйвери достатньо надійними і для багатьох продакшн-застосунків.

+ LARAVEL 11
DB_CONNECTION=sqlite
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=database
ФУНКЦІЇ · 2

Нові функції

2.1 · НОВЕ

Метод casts() у моделях

Значення властивості $casts може бути лише константним виразом, тому аргументи касту склеювали в рядок через двокрапку. Метод casts() повертає той самий масив, але всередині вже можна писати AsCollection::using() чи AsEnumCollection::of(). Старий $casts працює далі, Laravel обʼєднує обидва.

+ LARAVEL 11
protected function casts(): array
{
    return [
        'options' => AsCollection::using(OptionCollection::class),
    ];
}
− LARAVEL 10
protected $casts = [
    'options' => AsCollection::class.':'.OptionCollection::class,
];
2.2 · НОВЕ

once()

Хелпер кешує результат closure в памʼяті на час запиту, і повторні виклики з тим самим callback повертають збережене значення без статичних змінних. Усередині обʼєкта кеш окремий для кожного екземпляра. Пакет spatie/once для цього більше не потрібен.

+ LARAVEL 11
function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}
− LARAVEL 10
function random(): int
{
    static $value;

    return $value ??= random_int(1, 1000);
}
ПРОДУКТИВНІСТЬ · 1

Продуктивність

3.1 · ТЕСТИ

Швидші тести з SQLite :memory:

З базою :memory: Laravel 10 проганяв міграції перед кожним тестом. Тепер RefreshDatabase зберігає PDO-зʼєднання, мігрує один раз і загортає кожен тест у транзакцію з відкатом. За оцінкою команди Laravel, загальний час прогону часто скорочується вдвічі.

+ LARAVEL 11
// phpunit.xml: DB_CONNECTION=sqlite, DB_DATABASE=:memory:
use Illuminate\Foundation\Testing\RefreshDatabase;

class OrderTest extends TestCase
{
    use RefreshDatabase;
}
БЕЗПЕКА · 2

Безпека

4.1 · НОВЕ

Плавна ротація APP_KEY

Laravel шифрує всі cookie, включно із сесійною, тому зміна APP_KEY розлогінювала всіх користувачів, а дані, зашифровані старим ключем, ставали нечитабельними. Тепер шифрування завжди йде поточним ключем, а для розшифрування Laravel спершу бере його, а потім по черзі пробує попередні.

+ LARAVEL 11
APP_KEY="base64:J63qRTDLub5NuZvP+kb8YIorGS6qFYHKVo6u7179stY="
APP_PREVIOUS_KEYS="base64:2nLsGFGzyoae2ax3EF2Lyq/hH6QghBGLIq5uL+Gp8/w="
4.2 · НОВЕ

Автоматичне перехешування паролів

Work factor bcrypt треба піднімати з ростом потужності CPU і GPU, але старі хеші лишались слабшими, поки їх не перерахувати вручну через Hash::needsRehash(). Тепер Laravel сам перехешовує пароль, коли користувач успішно входить. Вимикається це опцією rehash_on_login.

+ LARAVEL 11
// config/hashing.php
'bcrypt' => [
    'rounds' => env('BCRYPT_ROUNDS', 12),
],

'rehash_on_login' => true,
− LARAVEL 10
if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}
BREAKING

Ламає сумісність

Перевірте це до оновлення: такий код перестане працювати або поводитиметься інакше.

PHP 8.2 і curl 7.34Потрібен PHP 8.2.0 або новіший, а HTTP-клієнту Laravel потрібен curl 7.34.0+.
SQLite 3.26.0+Застосунки на SQLite працюють лише з версією 3.26.0 і новішими.
change() у міграціяхПід час зміни колонки перелічуйте всі модифікатори, які хочете зберегти. unsigned, default чи comment без явного виклику зникнуть.
double і float у міграціяхТипи працюють однаково в усіх БД без $total і $places, а unsignedDecimal, unsignedDouble та unsignedFloat прибрали.
Sanctum, Passport, Cashier, Telescope, SparkПотрібні Sanctum 4, Passport 12, Cashier Stripe 15, Telescope 5 і Spark Stripe 5. Свої міграції вони більше не підвантажують, їх треба опублікувати.
Passport 12 без password grantPassword grant вимкнено за замовчуванням, його вмикає Passport::enablePasswordGrant().
Carbon 3Laravel 11 підтримує Carbon 2 і 3. У Carbon 3 методи diffIn* повертають float і можуть бути відʼємними.
Limit і ThrottlesExceptions у секундахКонструктори Limit, GlobalLimit, ThrottlesExceptions і ThrottlesExceptionsWithRedis приймають секунди замість хвилин, decayMinutes став decaySeconds.
Перехешування паролівЯкщо колонка пароля називається не password, вкажіть її у властивості $authPasswordName моделі.
spatie/onceУ Laravel тепер є власна функція once(), тому пакет варто прибрати, щоб уникнути конфлікту.

Як оновитися

0 / 7