Laravel v12.53.0 додає Cache::funnel() для обмеження конкурентності на будь-якому кеш-драйвері з підтримкою замків, вводить підтримку іменованих аргументів при диспатчі та broadcasting подій і розширює повнотекстовий пошук у PostgreSQL підтримкою попередньо обчислених tsvector-колонок.
Основні новинки:
Cache::funnel() для обмеження конкурентності через кешwhereFullText «vector» для попередньо обчислених tsvector-колонок (PostgreSQL)buildMorphMapFromModels() приймає ключі масивуphp artisan down тепер оновлює опції maintenance mode без підняття сайту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
Трейт 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
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 тепер може повторно запускатися, коли додаток вже в режимі технічного обслуговування, щоб оновити опції — наприклад 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-макроси для запланованих команд тепер можна застосовувати до груп розкладу, що дозволяє зареєструвати спільну поведінку один раз і застосувати її до всіх команд у групі замість кожного запису окремо.
Pull Request: #58926
Database:
Queue & Jobs:
RetryCommand для SQS FIFO черг (#58936)oldest_pending у queue:monitor (#58952)HTTP & Caching:
RequestException для Guzzle streamed responses (#58909)Testing:
assertSessionHasAll (#58946)Mail:
left на start для кращої підтримки RTL мов (#58935)Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!
Вперше у світі Laravel з'являється можливість, яка значно спростить ваше повсякденне програмування завдяки новому пакету Laravel Boost. Читайте статтю, щоб дізнатися, як посилена інтеграція штучного інтелекту може підвищити ефективність вашої роботи та оптимізувати створення проектів у Laravel
Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті