Увійти Реєстрація
Вакансії
Вакансії Laravel Компанії Статистика
Підготовка
Як підготуватися < href="https://laravelukraine.com/interviews" wire:navigate.hover class="flex items-center gap-3 rounded-md px-3 py-2 text-base font-medium text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-900 dark:hover:text-white" >Співбесіди Тестування Документація
Блог
Всі статті Серії
Екосистема
Пакети Ресурси Проєкти Інструменти Події Відео
Інше
Про нас Реклама
Новини 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.

52

Читати в документації

Коментарі

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

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

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

Новини 14 листопада 2026

RFC пропонує хуки життєвого циклу запиту для воркер-режиму PHP

Кевін Дюнгла виніс на обговорення RFC «Request lifecycle hooks for SAPIs with a worker mode»: два нові хуки модулів request_begin і request_end та функції php_request_begin() і php_request_end(). Вони мають замінити крихкі скидання стану, через які FrankenPHP цього року виправляв витік session ID і помилки пам'яті. Ціль - PHP 8.7, голосування ще не призначене.

7
Новини 14 листопада 2026

Laravel Storage Dedupler: один файл на диску замість десятка копій

Пакет maxkhim/laravel-storage-dedupler зберігає кожен файл один раз: ключем стає SHA-1 хеш вмісту, а моделі через трейт Deduplable отримують посилання на спільний UniqueFile. У версії 1.0.6 з'явився DEDUPLER_REMOVE_ORPHAN_ON_DETACH, що вирішує долю файлу після останнього detach.

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

Backend-розробник (PHP / Symfony)

Розробка та супровід API публічного сайту oranta.ua, реалізація сценаріїв оформлення полісів, платежів, особистого кабінету та подання заявок. Інтеграція з внутрішніми системами, CRM, платіжними сервісами і зовнішніми API, підтримка адмінпанелі, фонових задач та логування. Ключовий стек: PHP 8, Symfony 6, Doctrine ORM, REST API, PostgreSQL, Redis, Symfony Messenger або SQS, Docker, PHPUnit. Вимоги: від 2 років комерційного досвіду з PHP, англійська на рівні читання технічної документації.

ДЗО, ТОВ
4 дні тому

Senior PHP розробника

Senior PHP-розробник відповідатиме за розроблення, розвиток і підтримку серверної частини вебзастосунків, проєктування нового функціоналу, рефакторинг, code review та усунення помилок. Ключовий стек: нативний PHP, Symfony, MySQL, PostgreSQL, REST API, RabbitMQ, Redis, AWS. Вимоги: досвід розробки на рівні Senior, глибоке знання ООП і патернів проєктування, оптимізовані SQL-запити, інтеграція зі сторонніми сервісами та досвід роботи з Git.

N-iX
8 днів тому

Senior / Lead PHP Engineer with AI skills (#5887)

Розробка та підтримка backend-сервісів і API на PHP та Laravel для нового великого релізу європейського онлайн-маркетплейсу автомобілів. Завдання включають інтеграцію агентних AI-потоків (LLM-агенти, tool-calling), менторство інженерів і відповідальність за фічі від дизайну до моніторингу. Вимоги: 6+ років PHP, 4+ роки з Laravel, практичний досвід GenAI, сильні знання MySQL/PostgreSQL, Docker та хмарних платформ, англійська Upper-Intermediate.

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

Laravel Web Tinker

spatie/laravel-web-tinker

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

1,221 1.12.0 13 6

Laravel Prompts

laravel/prompts

Гарні інтерактивні поля для консольних команд: запити, паролі, вибір зі списку, автодоповнення і прогрес-бари з валідацією. Використовується самим Artisan і доступне у ваших командах.

721 v0.3.23 9