У Laravel 12.47.0 додали Cache::withoutOverlapping — зручний спосіб уникнути одночасного виконання

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 14 січня, 2026
Laravel 12.47.0 приносить корисні оновлення: @includeIsolated для ізольованих Blade-включень, Cache::withoutOverlapping() для уникнення одночасного виконання, розширену підтримку enum і підтримку precognitive-запитів для валідації масивів. Хочете дізнатися, як ці зміни спростять роботу з шаблонами, кешуванням і нотифікаціями?

Дата релізу: 13 січня 2026
Версія Laravel: 12.47.0

Коротко

Laravel 12.47.0, випущений 13 січня 2026 року, приносить кілька покращень для розробницького досвіду: новий Blade-директив @includeIsolated для ізольованих include'ів, зручний метод Cache::withoutOverlapping() для операцій з блокуванням та розширену підтримку enum у різних частинах фреймворку. Додано підтримку precognitive-запитів для валідації масивів з wildcard, а також зроблено Notification клас macroable.

Основні новинки:

Що нового

Ізольовані include у Blade — @includeIsolated

У Laravel 12.47.0 з'явився директив @includeIsolated, що дозволяє підключати Blade-шаблон без успадкування змінних з батьківського view. У включеного шаблону буде "чистий" контекст — тільки ті змінні, які ви явно передали. Це запобігає випадковому витоку змінних і робить шаблони передбачуванішими.

Стандартний @include успадковує змінні батьківського view:

{{-- $user is available in the parent --}}
@include('partials.header') {{-- $user is also available here --}}

З @includeIsolated включений шаблон починається з порожнього набору змінних і отримає лише те, що ви передасте:

{{-- $user is available in the parent --}}
@includeIsolated('partials.header') {{-- $user is NOT available here --}}
 
{{-- Pass only what you need --}}
@includeIsolated('partials.header', ['title' => 'Welcome'])

Особливо корисно при:

Pull Request: #58311

Зручність блокувань з Cache::withoutOverlapping()

Новий метод Cache::withoutOverlapping() дає простіший API для виконання коду, який не має виконуватись одночасно в кількох процесах. Він обгортає звичний паттерн отримання блокування з очікуванням.

Раніше писали так:

Cache::lock('processing-order-' . $orderId)
    ->block(10)
    ->get(function () use ($orderId) {
        // Process the order
    });

Тепер можна використовувати більш виразний withoutOverlapping():

Cache::withoutOverlapping('processing-order-' . $orderId, function () use ($orderId) {
    // Process the order - guaranteed no concurrent execution
}, seconds: 10);

Метод приймає ключ, callback і необов'язкові параметри для таймауту очікування та часу життя блокування:

Cache::withoutOverlapping(
    key: 'send-daily-report',
    callback: fn () => $this->generateAndSendReport(),
    seconds: 30,        // Wait up to 30 seconds for the lock
    owner: 'worker-1'   // Optional lock owner identifier
);

Ідеально підходить для job'ів у черзі, планувальника і будь-яких операцій, де паралельне виконання може призвести до неконсистентних даних.

Pull Request: #58303

Precognitive-запити з валідацією масивів по wildcard

Функція precognition тепер підтримує валідацію масивів з wildcard. Це дозволяє правильно валідовати поля масивів у precognitive-запитах, де використовують синтаксис *.

При валідації масивних полів з правилами типу:

$request->validate([
    'items' => ['required', 'array'],
    'items.*.name' => ['required', 'string', 'max:255'],
    'items.*.quantity' => ['required', 'integer', 'min:1'],
]);

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

Pull Request: #57486

Notification class стала macroable

Клас Illuminate\Notifications\Notification тепер macroable — можна додавати власні методи до всіх сповіщень:

use Illuminate\Notifications\Notification;
 
Notification::macro('sendToSlack', function (ChannelAwareSlackNotification $notification): void {
    Notification::route('slack', $notification::slackChannel())->notify($notification);
});

Це дає змогу додавати спільну функціональність для всіх notification без створення базового класу.

Pull Request: #58352

Enum у PendingBatch::onConnection()

Метод PendingBatch::onConnection() тепер приймає значення enum, що робить його сумісним з іншими частинами фреймворку, які вже підтримують enum для з'єднань черг:

enum QueueConnection: string
{
    case Redis = 'redis';
    case Database = 'database';
    case Sync = 'sync';
}
 
Bus::batch([
    new ProcessPodcast($podcast),
    new OptimizePodcast($podcast),
])->onConnection(QueueConnection::Redis)->dispatch();

Pull Request: #58350

Enum-ключі в додаткових методах Session Store

Додаткові методи Session Store тепер підтримують enum-ключі, що підвищує типобезпечність операцій з сесіями:

enum SessionKey: string
{
    case Cart = 'cart';
    case User = 'user';
    case Preferences = 'preferences';
}
 
// Now supported with enum keys
session()->get(SessionKey::Cart);
session()->put(SessionKey::User, $user);
session()->forget(SessionKey::Preferences);

Pull Request: #58343

Дедуплікація циклічних посилань у JSON API

У JSON API-ресурсах Laravel циклічні посилання тепер автоматично дедуплікуються. Це запобігає нескінченним циклам і зменшує розмір відповіді при двобічних зв'язках:

// User has many posts, Post belongs to User
// Previously could cause circular reference issues
// Now automatically handled
return new UserResource($user->load('posts.author'));

Pull Request: #58348

Краще повідомлення про помилку для key:generate

Команда php artisan key:generate тепер показує корисніше повідомлення, коли APP_KEY вже встановлений. Це пояснює, чому ключ не генерується, і підказує використати прапорець --force, якщо ви дійсно хочете перегенерувати ключ:

$ php artisan key:generate
# Now shows: Application key already set. Use --force to regenerate.

Pull Request: #58345

Індекси для таблиці failed_jobs

Шаблон міграції failed_jobs тепер містить індекси для покращення продуктивності запитів. Під час створення таблиці автоматично додаються індекси на часто запитувані колонки:

Schema::create('failed_jobs', function (Blueprint $table) {
    $table->id();
    $table->string('uuid')->unique();
    $table->text('connection');
    $table->text('queue')->index();  // New index
    $table->longText('payload');
    $table->longText('exception');
    $table->timestamp('failed_at')->useCurrent()->index();  // New index
});

Це прискорює запити до failed_jobs за назвою черги або часом помилки.

Pull Request: #58355

Bus::batch фільтрує falsy-елементи

Bus::batch() тепер автоматично видаляє falsy-елементи, що спрощує умовне додавання job'ів до батчу:

Bus::batch([
    new ProcessOrder($order),
    $needsNotification ? new SendNotification($order) : null,
    $needsAnalytics ? new TrackAnalytics($order) : null,
])->dispatch();
// Falsy items (null, false) are automatically removed

Pull Request: #58360

Додаткові зміни

У реліз також увійшло кілька інших поліпшень:

Нотатки при оновленні

Для типових застосунків не очікується зламу сумісності. Перед оновленням перегляньте повний changelog для деталей.

Посилання

Популярні

Logomark Logotype

Використання штучного інтелекту для управління перекладами в Laravel

Досліджуйте нові можливості локалізації вашого Laravel-додатку з пакунками, які використовують штучний інтелект, такими як ChatGPT та Claude. Які рішення можуть спростити ваш процес перекладу та зробити його більш точним? Читайте далі, щоб дізнатися більше!

Logomark Logotype

Використання повнотекстового пошуку в Laravel

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

Logomark Logotype

4 поширені помилки Vite у Laravel

Використання Vite для створення фронтенд-ресурсів у вашому додатку Laravel може бути захоплюючим, але іноді ви можете стикнутися з певними помилками. У цій статті ми розглянемо чотири поширені помилки, з якими ви можете зіткнутися, а також підкажемо способи їх усунення, щоб ви могли знову зосередитися на розробці вашого додатку