Laravel v12.53.0 додає Cache::funnel() для обмеження конкурентності на будь-якому кеш-драйвері з підтримкою замків, вводить підтримку іменованих аргументів при диспатчі та broadcasting подій і розширює повнотекстовий пошук у PostgreSQL підтримкою попередньо обчислених tsvector-колонок.
Основні новинки:
Cache::funnel()для обмеження конкурентності через кеш- Іменовані аргументи при диспатчі та broadcasting подій
- Опція
whereFullText«vector» для попередньо обчисленихtsvector-колонок (PostgreSQL) buildMorphMapFromModels()приймає ключі масивуphp artisan downтепер оновлює опції maintenance mode без підняття сайту- Event-макроси для груп розкладу
Що нового
Cache::funnel() — обмеження конкурентності
Cache::funnel() додає механізм обмеження конкурентності для будь-якого кеш-драйвера, що підтримує атомарні замки — зокрема драйвери array, file, database та Redis. Раніше обмеження конкурентності базувалося на Redis::funnel() та вимагало підключення до Redis. Тепер фасадний метод працює на різних драйверах, використовуючи ті самі примітиви замків, що вже є в шарі кешу.
Cache::funnel('payment-processing')
->limit(3)
->releaseAfter(60)
->then(
fn() => processPayment(),
fn() => 'Currently at capacity'
);
limit(int $slots)— максимально дозволена кількість одночасних операційreleaseAfter(int $seconds)— час утримання замка перед автоматичним звільненнямblock(int $timeout)— скільки чекати на вільний слот перед відмовоюthen(callable $success, callable $failure)— виконує callback успіху при отриманні слота або callback невдачі при блокуванні
Якщо драйвер не підтримує замки, буде кинуто BadMethodCallException. Якщо таймаут блокування мине і не вказано callback невдачі, буде кинуто LimiterTimeoutException.
Pull Request: #58439
Іменовані аргументи в диспатчі та broadcasting подій
Трейт Dispatchable тепер підтримує іменовані аргументи при виклику dispatch() та broadcast() у класах подій. Раніше трайт використовував func_get_args(), що знехтувало іменами аргументів. Перехід на варіадичний синтаксис дозволяє іменованим аргументам потрапляти в конструктор події.
// Before — positional arguments only
event(new UserSubscribed($user, $plan, $metadata));
// After — named arguments now work
UserSubscribed::dispatch(
user: $user,
plan: $plan,
metadata: ['source' => 'checkout'],
);
Це узгоджується з тим, як іменовані аргументи вже працюють для dispatching job'ів. Існуючі виклики з позиційними аргументами продовжать працювати без змін.
Pull Request: #58913
PostgreSQL: повнотекстовий пошук з попередньо обчисленими tsvector-колонками
whereFullText() отримав опцію vector для PostgreSQL, яка трактує колонку як попередньо обчислений tsvector, замість того щоб обгортати її в to_tsvector() при кожному запиті. Це корисно, якщо ви підтримуєте окрему tsvector-колонку — часто з індексом GIN — щоб уникнути витрат на повторне обчислення вектору під час запиту.
// Without vector option — wraps column in to_tsvector()
$query->whereFullText('body', $term, ['language' => 'english']);
// With vector option — uses the column directly
$query->whereFullText('search_vector', $term, [
'vector' => true,
'language' => 'english',
'mode' => 'websearch',
]);
// Also works with multiple tsvector columns
$query->whereFullText(['tsv_title', 'tsv_body'], $term, ['vector' => true]);
Pull Request: #58893
buildMorphMapFromModels() приймає ключі масиву
buildMorphMapFromModels() тепер приймає масиви з будь-якими типами ключів — рядковими або цілими — при побудові morph map з моделей. Раніше параметр приймав лише список з числовими ключами, що перешкоджало використанню кастомних рядкових псевдонімів:
// Custom string aliases now work
Relation::buildMorphMapFromModels([
'post' => Post::class,
'video' => Video::class,
]);
Pull Request: #58891
php artisan down оновлює опції maintenance mode на місці
php artisan down тепер може повторно запускатися, коли додаток вже в режимі технічного обслуговування, щоб оновити опції — наприклад secret, message або retry — без необхідності спочатку виводити сайт з цього режиму. Раніше треба було виконати php artisan up перед зміною налаштувань maintenance mode.
# Put site in maintenance mode
php artisan down --secret="my-secret"
# Update the secret without bringing the site back up
php artisan down --secret="new-secret"
Pull Request: #58918
Event-макроси для груп розкладу
Event-макроси для запланованих команд тепер можна застосовувати до груп розкладу, що дозволяє зареєструвати спільну поведінку один раз і застосувати її до всіх команд у групі замість кожного запису окремо.
Pull Request: #58926
Виправлення помилок та покращення
Database:
- Виправлено null-safe порівняння між базами даних (#58962)
- Відкат залишкового стану PDO перед повторною спробою при deadlock на commit (#58906)
Queue & Jobs:
- Виправлено серіалізацію моделей у queue job'ах (#58939)
- Виправлено некоректну роботу
RetryCommandдля SQS FIFO черг (#58936) - Забезпечено правильне відображення
oldest_pendingуqueue:monitor(#58952)
HTTP & Caching:
- Виправлено race condition при створенні файлу реального facade cache (#58947)
- Виправлено узагальнення
RequestExceptionдля Guzzle streamed responses (#58909) - Cache тепер підтримує серіалізовані значення класів (#58911)
Testing:
- Показувати всі невідповідні значення у виводі помилки
assertSessionHasAll(#58946)
Mail:
- Змінено вирівнювання тексту з
leftнаstartдля кращої підтримки RTL мов (#58935)