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

Перекладено ШІ 1 Laravel News 02 червня, 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.

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

  • Новий Blade-директив @includeIsolated для include'ів з ізольованими змінними
  • Cache::withoutOverlapping() — спрощення операцій з блокуванням
  • Підтримка precognitive-запитів для валідації масивів з wildcard
  • Notification class тепер macroable
  • PendingBatch::onConnection() тепер приймає значення enum
  • Додана підтримка enum-ключів у методах Session Store
  • Дедуплікація циклічних посилань у JSON API
  • Покращене повідомлення про помилку для key:generate, коли APP_KEY вже встановлений
  • Додано індекси в шаблон міграції failed_jobs
  • Bus::batch тепер фільтрує falsy-елементи

Що нового

Ізольовані 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

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

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

  • Виправлено QueryException для правильного показу деталей з'єднання для read PDO-підключень (#58331)
  • Покращені return-типи для помічників Number::with*() (#58358)
  • Виправлено опечатку в методі JsonApiResource trait (#58326)
  • Оновлено анотації типів повернення в FormRequest.php (#58333)
  • Виправлено події composer uninstall — тепер вони спрацьовують лише при видаленні dev-пакунків (#58338)
  • Покращено типи в хелпері \Illuminate\Support\Str (#58356)

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

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

Посилання

Популярні

Інше, що варто прочитати

19 Оновлено 01 червня, 2026

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

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

173 Оновлено 01 червня, 2026

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

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

37 Оновлено 01 червня, 2026

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

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