Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас
Новини 25 червня 2026

Підтримка метаданих маршрутів у Laravel 13.17

Команда Laravel випустила версію 13.17.0 з першокласною підтримкою метаданих маршрутів, інтеграцією з PostgreSQL transaction pooler, новою artisan-командою dev:list та обробником винятків Should Not Retry для роботи з чергами.

Підтримка метаданих маршрутів

Маршрути тепер можуть переносити структуровані метадані через весь конвеєр побудови маршрутів, включаючи серіалізацію route:cache та успадкування груп. Раніше розробники могли зберігати користувацькі дані всередині масиву action маршруту, але не існувало офіційного способу послідовного додавання структурованих даних через весь конвеєр. Цей реліз робить метадані першокласним атрибутом маршрутів.

Додайте метадані безпосередньо до маршруту за допомогою методу metadata():

Route::get('/users', [UserController::class, 'index'])
    ->metadata(['head' => ['title' => 'Users']]);

Зчитуйте їх з розв'язаного маршруту за допомогою getMetadata(), який підтримує dot-нотацію та необов'язкове значення за замовчуванням:

$request->route()->getMetadata('head.title');          // 'Users'
$request->route()->getMetadata('head.author', 'Taylor');

Метадані, встановлені на групі, каскадно поширюються на кожен маршрут всередині неї. Асоціативні масиви об'єднуються рекурсивно, тому вкладені групи можуть нашаровувати значення, тоді як списки та скалярні значення замінюють успадковані:

Route::metadata(['head' => ['robots' => ['noindex'], 'author' => 'Taylor']])
    ->group(function () {
        Route::get('/users', [UserController::class, 'index'])
            ->metadata(['head' => ['title' => 'Users']]);
    });
// getMetadata('head') => [
//     'robots'  => ['noindex'],
//     'author'  => 'Taylor',
//     'title'   => 'Users',
// ]

Також підтримуються resource та singleton маршрути. Використовуйте setMetadata() на екземплярі маршруту, щоб замінити метадані замість їх об'єднання.

Підтримка PostgreSQL Transaction Pooler

Цей реліз додає підтримку на рівні фреймворка для проксі-з'єднань PostgreSQL, які використовують transaction-mode pooling, включаючи PgBouncer, AWS RDS Proxy та Neon. У режимі transaction-mode pooling серверне з'єднання утримується лише протягом однієї транзакції, що робить підготовлені оператори несумісними з pooler. Laravel тепер обробляє це автоматично.

Увімкніть pooled режим у вашому конфігураційному файлі database.php:

'pgsql' => [
    'driver'  => 'pgsql',
    'pooled'  => true,
    'url'     => env('DATABASE_URL'),
    // Опціонально: прямий (non-pooled) endpoint для DDL та міграцій
    'direct'  => env('DATABASE_DIRECT_URL'),
    // ...
],

Коли pooled встановлено в true, з'єднання переключається на емульовані prepares, які сумісні з transaction-mode poolers. Команди, що потребують прямого з'єднання (міграції, schema:dump, db:wipe), автоматично направляються до direct endpoint. Інтерактивна команда php artisan db також за замовчуванням використовує direct endpoint, коли він налаштований.

З'єднання без pooled => true зберігають існуючу поведінку native-prepare, тому зміна повністю зворотно сумісна.

Команда dev:list

Нова команда php artisan dev:list виводить список усіх зареєстрованих dev-процесів разом із джерелом, яке зареєструвало кожен з них (ваш додаток або vendor-пакет). Це базується на команді artisan dev, доданій у версії 13.16.0.

php artisan dev:list
php artisan dev:list --except-vendor   # приховати vendor-зареєстровані команди
php artisan dev:list --only-vendor     # показати лише vendor-зареєстровані команди
php artisan dev:list --filter=reverb   # фільтрувати за назвою
php artisan dev:list --json

Цей реліз також замінює блокувальник автоматичної реєстрації vendor з версії 13.16.0 на відстеження джерела. Кожна dev-команда тепер знає, чи вона була зареєстрована з вашого додатка або з vendor-пакета, що dev:list використовує для їх розрізнення у виводі.

Обробник винятків Should Not Retry

Завдання у чергах тепер можуть визначати на рівні винятку, чи слід повторювати спробу після помилки. Метод retry() може розміщуватися безпосередньо в класі винятку:

class PaymentGatewayException extends RuntimeException
{
    public function retry(): bool
    {
        return false; // ніколи не повторювати цей виняток
    }
}

Цей самий метод може бути зареєстрований через обробник withExceptions() у bootstrap вашого додатка для винятків, якими ви не володієте:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->retry(PaymentGatewayException::class, function () {
        return false;
    });
})

Коли retry() повертає false, завдання негайно позначається як невдале без витрачання решти спроб.

Виправлення порядку викликів timezone для between()/unlessBetween()

Методи планувальника between() та unlessBetween() раніше оцінювали часовий пояс під час визначення, тому розміщення timezone() після них у ланцюжку мовчки використовувало неправильний часовий пояс:

// раніше: лише цей порядок працював правильно
$schedule->command('report')->timezone('Europe/Rome')->between('10:00', '12:00');
// раніше: це використовувало UTC замість Europe/Rome, мовчки
$schedule->command('report')->between('10:00', '12:00')->timezone('Europe/Rome');

Обидва ланцюжки тепер дають однаковий результат. Часовий пояс зчитується при виконанні фільтра, а не при його визначенні.

Прапорець --without-migration-data для schema:dump

Команда schema:dump приймає новий прапорець --without-migration-data, який пропускає рядки таблиці міграцій з виводу. Це корисно, коли потрібен чистий дамп схеми для налаштування тестів без відстеження виконаних міграцій:

php artisan schema:dump --without-migration-data

Інші виправлення та покращення

Версія 13.17.0 також включає:

  • Зменшено кількість читань з кешу при debouncing завдань з maxWait - з двох читань на відправку до одного
  • Виправлено десеріалізацію кешу FileStore для записів з короткими timestamps
  • Виправлено перевірку vendor-реєстрації DevCommands для коректного пропуску userland frames
  • Очищено стан transaction manager при від'єднанні бази даних
  • Дозволено brick/math 0.18
  • Покращено typehints у InteractsWithData, boolean/numeric валідації та формах масивів

Повний список змін доступний у офіційному changelog та Release v13.17.0.

51

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Валідація ключів масиву
Новини 08 серпня 2026

Валідація ключів масиву в Laravel: нове правило array_keys

Laravel 13.24 додає правило валідації array_keys, яке дозволяє чітко визначити допустимі ключі масиву та відхиляти неочікувані. Це вирішує проблему тихих помилок у фільтрах API та запобігає запису зайвих даних у JSON-колонки.

3
Saga Lara Flow
Новини 08 серпня 2026

Saga Lara Flow: тривалі воркфлоу та компенсуючі транзакції на основі черг Laravel

Saga Lara Flow - пакет для Laravel, що дозволяє писати довготривалі бізнес-процеси як звичайні PHP-методи поверх черг Laravel. Підтримує автоматичні відкати транзакцій, сигнали, паралельні блоки та вкладені воркфлоу із записом кожного кроку до бази даних.

Вакансії за темою

Respect.Studio Нова
2 дн. тому

Strong Middle PHP Engineer (Lviv or Odesa preferred)

Розробник backend на Laravel для платформи маркетингової автоматизації DemandSense. Потрібен досвід роботи з PostgreSQL, AWS (EC2, S3, RDS, Lambda), інтеграцією сторонніх API та великими обсягами даних. Вимагається проактивність, знання Git, CI/CD та англійська мова.

НК Нова
2 дн. тому

Head of IT

Керівник IT-напрямку в фінансовій компанії. Відповідальність за інфраструктуру (24/7 стабільність, VMware/Hyper-V), розробку продуктів (CRM, REST/SOAP інтеграції), кібербезпеку та комплаєнс НБУ, управління IT-командою. Вимоги: 2+ років на керівних позиціях,技нічна освіта, досвід з PHP/Laravel, MS SQL/PostgreSQL, архітектури мереж.

Par Soft
3 дн. тому

PHP Laravel Developer

PHP Laravel розробник з досвідом 2+ років для розробки та підтримки вебзастосунків. Необхідні навички: Laravel, REST API, MariaDB/PostgreSQL, Git, ООП, MVC, SOLID. Основні обов'язки: підтримка існуючого коду та розробка нових функцій. Формат роботи: ремоут з гнучким графіком.

Пакети за темою

Laravel Web Tinker

spatie/laravel-web-tinker

Інтерактивна оболонка Artisan Tinker прямо у браузері для швидкого тестування та налагодження коду Laravel.

1,217 1.10.6 13 5

Laravel Short Schedule

spatie/laravel-short-schedule

Планування виконання artisan команд із частотою менше однієї хвилини.

658 1.7.0 3