Дата релізу: 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 для деталей.
Посилання
- Повний Changelog: v12.46.0...v12.47.0
- Офіційний Changelog: CHANGELOG.md#v12470