---
title: "Файлові системи з автопросуванням та відкладені слухачі у Laravel 13.26"
url: https://laravelukraine.com/blog/failovi-sistemi-z-avtoprosuvanniam-ta-vidkladeni-sluxaci-u-laravel-1326
date: 2026-08-20
source: https://laravel-news.com/laravel-13-26-0?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+laravelnews
---

# Файлові системи з автопросуванням та відкладені слухачі у Laravel 13.26

Команда Laravel випустила версію 13.26.0 18 серпня 2026 року. Реліз додає драйвер файлової системи read-through, який шарує основний диск поверх резервного та просуває файли при першому читанні, можливість відкладання (debouncing) для слухачів подій у черзі, метод `Queue::forward()` для перенаправлення черг без змін у класах завдань, а також низку покращень роботи з процесами, Eloquent та Redis.

## Файлові системи з автопросуванням (Read-Through)

Новий драйвер `read-through` об'єднує два існуючі диски в один. При читанні спочатку перевіряється основний диск, а при його відсутності відбувається звернення до резервного з автоматичним копіюванням файлу на основний диск. Таким чином основний диск поступово заповнюється лише тими файлами, які реально запитуються. Операції запису, видалення та отримання списку директорій виконуються лише на основному диску:

```php
'assets' => [
    'driver' => 'read-through',
    'primary' => 'r2',
    'fallback' => 'legacy-s3',
],
```

Диски можна вказувати як назви (як у прикладі вище) або визначати безпосередньо як масиви конфігурації. Опція `copy => false` дозволяє віддавати файли з резервного диску без просування на основний, що підходить для середовищ розробки, які працюють з продакшн-файлами. Помилки просування за замовчуванням ігноруються, щоб операція читання ніколи не провалювалася через невдале копіювання. Встановіть `throw_on_promotion_failure => true`, щоб викидати виключення при помилках.

Функціональність додана [@taylorotwell](https://github.com/taylorotwell) у [\/\#61140](https://github.com/laravel/framework/pull/61140), опція без копіювання - [@jimbojsb](https://github.com/jimbojsb) у [\/\#61155](https://github.com/laravel/framework/pull/61155).

## Відкладені слухачі подій у черзі

Атрибут `#[DebounceFor]`, який додав можливість відкладання для завдань у черзі в Laravel 13.6, тепер працює і зі слухачами подій у черзі. Коли одна й та сама подія спрацьовує багаторазово, виконується лише останнє відправлення в межах вікна:

```php
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\DebounceFor;

#[DebounceFor(30, maxWait: 120)]
class UpdateProductSearchIndex implements ShouldQueue
{
    public function debounceId(ProductUpdated $event): string
    {
        return (string) $event->product->getKey();
    }
    
    public function handle(ProductUpdated $event): void
    {
        // переіндексація виконається один раз із найновішим станом
    }
}
```

Метод `debounceId()` обмежує вікно для кожного окремого ресурсу, параметр `maxWait` встановлює максимальний час, протягом якого активний потік подій може відкладати виконання роботи. Відкладання застосовується лише до цього слухача, тому інші слухачі тієї ж події виконуються кожного разу. Відкладений слухач не може одночасно реалізовувати `ShouldBeUnique` - диспетчер викине `LogicException`, оскільки унікальність зберігає перше відправлення, а відкладання - останнє.

Додано [@stevebauman](https://github.com/stevebauman) у [\/\#61169](https://github.com/laravel/framework/pull/61169).

## Метод Queue::forward()

Метод `Queue::forward()` перенаправляє все, що відправляється до певної черги, на іншу чергу, інше з'єднання або обидва варіанти одночасно. Це робиться в одному місці в сервіс-провайдері без редагування класів завдань або місць їхнього відправлення:

```php
use Illuminate\Support\Facades\Queue;

Queue::forward('reports', 'reports.fifo', 'cloud'); // перейменування і зміна з'єднання
Queue::forward('payments', connection: 'cloud');    // збереження назви, зміна з'єднання
Queue::forward('updates', 'notifications');         // перейменування на тому ж з'єднанні
Queue::forward([
    'reports' => 'reports.fifo',
    'emails' => 'emails.fifo',
], connection: 'cloud');
```

Перенаправлення застосовуються через той самий механізм, що й `Queue::route()`, тому вони працюють незалежно від способу потрапляння завдання до черги. Додано [@jackbayliss](https://github.com/jackbayliss) у [\/\#61188](https://github.com/laravel/framework/pull/61188).

## Покращення роботи з процесами

Три нові можливості фасаду `Process`, усі від [@xurshudyan](https://github.com/xurshudyan). Пули процесів та їхні результати тепер ітеровані ([\/\#61184](https://github.com/laravel/framework/pull/61184)). Раніше `foreach` над `ProcessPoolResults` ітерував публічні властивості, яких немає, тому цикл для перевірки кодів виходу мовчки нічого не перевіряв. Обидва класи тепер реалізують `IteratorAggregate`.

Тайм-аут простою тепер викидає власний виняток `ProcessIdleTimedOutException` ([\/\#61182](https://github.com/laravel/framework/pull/61182)). Два тайм-аути означають протилежні речі - завислий процес проти повільного, але обидва раніше викидали `ProcessTimedOutException`:

```php
try {
    Process::timeout(600)->idleTimeout(30)->run('./deploy.sh');
} catch (ProcessIdleTimedOutException $e) {
    // немає виводу протягом 30 секунд: вбити і сповістити
} catch (ProcessTimedOutException $e) {
    // досі виробляє вивід, просто повільний: повторити з більшим часом
}
```

Фейк `Process` отримав допоміжні методи для перевірок ([\/\#61193](https://github.com/laravel/framework/pull/61193), [\/\#61197](https://github.com/laravel/framework/pull/61197)): `assertRanCount(2)` перевіряє кількість запущених процесів, `assertRanInOrder([...])` перевіряє послідовність, а `recorded()` фільтрує записані пари процесів та результатів за допомогою callback. Перевірки порядку та кількості приймають як рядкові команди, так і масиви.

## Доповнення Eloquent Builder

Методи `orWhereKey()` та `orWhereKeyNot()` доповнюють існуючу пару `whereKey()`, замінюючи fallback `orWhereIn('id', ...)` у запитах, де потрібна умова за первинним ключем у гілці `or` ([@calebdw](https://github.com/calebdw), [\/\#61154](https://github.com/laravel/framework/pull/61154)).

Методи `wherePivot()` та `orWherePivot()` приймають closure, яке отримує builder, обмежений до моделі pivot, тому scope, визначені на користувацькому pivot-класі, можна викликати з запиту зв'язку ([@calebdw](https://github.com/calebdw), [\/\#61150](https://github.com/laravel/framework/pull/61150)):

```php
$project->subscribers()
    ->wherePivot(fn ($query) => $query->active()->notMuted())
    ->get();
```

Метод `inOrderOf()` тепер приймає enum у списку значень, відповідно до підтримки enum в інших місцях query builder ([@ziadoz](https://github.com/ziadoz), [\/\#61147](https://github.com/laravel/framework/pull/61147)):

```php
$orders = Order::query()
    ->inOrderOf('status', [Status::Pending, Status::Processing, Status::Shipped])
    ->get();
```

Зв'язки також отримали аксесор `getRelatedClass()` ([\/\#61222](https://github.com/laravel/framework/pull/61222)).

## Покращена видимість Queue Worker

Нова подія `JobReleased` спрацьовує, коли завдання повертається до черги зі свого власного обробника або з middleware, такого як `WithoutOverlapping` ([\/\#61108](https://github.com/laravel/framework/pull/61108)). Існуюча подія `JobReleasedAfterException` покривала лише випадки повернення через виняток, тому повернення через перекриття було невидимим.

Worker тепер також виводять повідомлення, коли черга, яку вони обробляють, призупинена, і знову, коли вона відновлюється ([\/\#61142](https://github.com/laravel/framework/pull/61142)). З моменту появи API призупинення призупинений worker просто переставав виводити інформацію, що виглядало як зависання. Worker, запущений проти вже призупиненої черги, також повідомляє про це. Обидва внески від [@jackbayliss](https://github.com/jackbayliss).

## Інші виправлення та покращення

- Тепер підтримується Guzzle 8 поряд із Guzzle 7 ([\/\#60321](https://github.com/laravel/framework/pull/60321))
- Команда `db:seed --class=SpecificSeeder` показує той самий вивід прогресу RUNNING/DONE, який вкладені seeders вже отримували через `Seeder::call()` ([\/\#61186](https://github.com/laravel/framework/pull/61186))
- Серія покращень Redis: перевірки призупинених черг більше не виконують читання між слотами на кластерах ([\/\#61139](https://github.com/laravel/framework/pull/61139)), очищення тегів кешу сканує кожен головний вузол ([\/\#61174](https://github.com/laravel/framework/pull/61174)) і більше не зациклюється на застарілих тегах ([\/\#61181](https://github.com/laravel/framework/pull/61181)), невдалий pipeline або транзакція залишає з'єднання придатним ([\/\#61183](https://github.com/laravel/framework/pull/61183)), клієнт phpredis перебудовується після помилки відповіді кластера ([\/\#61214](https://github.com/laravel/framework/pull/61214)), деякі команди повторюються при тимчасових збоях ([\/\#61175](https://github.com/laravel/framework/pull/61175))
- Драйвер Cloud queue відкриває `managedQueues()` ([\/\#61149](https://github.com/laravel/framework/pull/61149)), події керованих черг просувають вкладені дані на верхній рівень ([\/\#61209](https://github.com/laravel/framework/pull/61209)), тайм-аути long-poll cloud agent повторюються ([\/\#61177](https://github.com/laravel/framework/pull/61177))
- Метод `throwUnless()` більше не мовчить у випадках, коли має викидати виняток ([\/\#61217](https://github.com/laravel/framework/pull/61217)), порядок ключів вводу `Request` зберігається при об'єднанні файлів ([\/\#61221](https://github.com/laravel/framework/pull/61221))
- Налаштування `readonly=false` дотримується в конфігурації Microsoft SQL Server ([\/\#61141](https://github.com/laravel/framework/pull/61141)), одинарні лапки екрануються в атрибутах JSON-шляху Postgres ([\/\#61192](https://github.com/laravel/framework/pull/61192)), параметри запиту JSON:API у вигляді масивів більше не викликають `TypeError` ([\/\#61206](https://github.com/laravel/framework/pull/61206))
- Команда `pail` для розробки реєструється лише коли встановлено Pail ([\/\#61157](https://github.com/laravel/framework/pull/61157)), `artisan dev` припиняє постійно пропонувати встановити `@laravel/multiplex` ([\/\#61167](https://github.com/laravel/framework/pull/61167)), закріплена версія multiplex видалена ([\/\#61171](https://github.com/laravel/framework/pull/61171))
- Покращення для тестування: помилки сесії зберігають оригінальне повідомлення про провал твердження ([\/\#61201](https://github.com/laravel/framework/pull/61201)), виправлено проблему повторного використання `setTestNow()` з `now()` ([\/\#61190](https://github.com/laravel/framework/pull/61190)), docblock `expectsQuestion()` дозволяє масиви відповідей ([\/\#61223](https://github.com/laravel/framework/pull/61223))

## Примітки щодо оновлення

Для типових застосунків не очікується breaking changes. Два моменти, про які варто знати: слухач із атрибутом `#[DebounceFor]` тепер викидає `LogicException`, якщо він також реалізує `ShouldBeUnique`, а внутрішня логіка `whereKey()` / `whereKeyNot()` була консолідована у [\/\#61154](https://github.com/laravel/framework/pull/61154), що має значення лише якщо ви розширюєте Eloquent builder і перевизначаєте ці методи. Перегляньте changelog для деталей по кожному PR при оновленні.
