Laravel 13.26: Read-Through Disks &amp; Debounced Listeners | Mohamed Said        [  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png)   Mohamed Said Laravel Backend Engineer  ](https://msaied.com) [ Home ](https://msaied.com) [ Projects ](https://msaied.com/projects) [ Articles  ](https://msaied.com/articles) [ Certificates ](https://msaied.com/certificates) [ Contact ](https://msaied.com#contact-section) 

       [  ](https://github.com/EG-Mohamed)       

 [ Home ](https://msaied.com) [ Projects ](https://msaied.com/projects) [ Articles ](https://msaied.com/articles) [ Certificates ](https://msaied.com/certificates) [ Contact ](https://msaied.com#contact-section) 

  [ home ](https://msaied.com)    [ articles ](https://msaied.com/articles)    Read-Through Disks and Debounced Listeners in Laravel 13.26        On this page       1. [  What's New in Laravel 13.26 ](#whats-new-in-laravel-1326)
2. [  Read-Through Filesystem Disks ](#read-through-filesystem-disks)
3. [  Debounced Queued Listeners ](#debounced-queued-listeners)
4. [  Queue::forward() ](#queueforward)
5. [  Process Improvements ](#process-improvements)
6. [  Eloquent Builder Additions ](#eloquent-builder-additions)
7. [  Queue Worker Visibility ](#queue-worker-visibility)
8. [  Other Notable Fixes ](#other-notable-fixes)
9. [  Key Takeaways ](#key-takeaways)

  ![Read-Through Disks and Debounced Listeners in Laravel 13.26](https://cdn.msaied.com/568/580ae69765054f5f750614e4d977ff56.png)

 [  Laravel ](https://msaied.com/articles?category=laravel)  #Laravel 13.26   #Filesystem   #Queue   #Eloquent   #Laravel Release  

 Read-Through Disks and Debounced Listeners in Laravel 13.26 
=============================================================

     18 Aug 2026      4 min read    ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said  

       Table of contents

  9 sections  

1. [  01   What's New in Laravel 13.26  ](#whats-new-in-laravel-1326)
2. [  02   Read-Through Filesystem Disks  ](#read-through-filesystem-disks)
3. [  03   Debounced Queued Listeners  ](#debounced-queued-listeners)
4. [  04   Queue::forward()  ](#queueforward)
5. [  05   Process Improvements  ](#process-improvements)
6. [  06   Eloquent Builder Additions  ](#eloquent-builder-additions)
7. [  07   Queue Worker Visibility  ](#queue-worker-visibility)
8. [  08   Other Notable Fixes  ](#other-notable-fixes)
9. [  09   Key Takeaways  ](#key-takeaways)

       What's New in Laravel 13.26
---------------------------

Laravel v13.26.0 was released on August 18, 2026. The headline additions are a `read-through` filesystem driver, debouncing support for queued event listeners, and a `Queue::forward()` helper. Here is a practical breakdown of every notable change.

---

### Read-Through Filesystem Disks

A new `read-through` driver layers a primary disk over a fallback. On the first read of any file, Laravel serves it from the fallback and promotes a copy to the primary, so the primary fills lazily with only the files that are actually requested. Writes, deletes, and directory listings always target the primary.

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

```

Set `copy => false` to serve from the fallback without promoting anything — useful in development environments pointed at production files. Promotion failures are silently swallowed by default; set `throw_on_promotion_failure => true` to surface them. Contributed by [@taylorotwell](https://github.com/taylorotwell) in [\#61140](https://github.com/laravel/framework/pull/61140).

---

### Debounced Queued Listeners

The `#[DebounceFor]` attribute, which already worked on queued jobs since Laravel 13.6, now applies to queued event listeners. When the same event fires repeatedly, only the last dispatch within the window executes the listener.

```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
    {
        // reindex once, with the latest state
    }
}

```

`debounceId()` scopes the window per resource, and `maxWait` caps how long a busy stream can keep deferring work. A listener carrying `#[DebounceFor]` cannot also implement `ShouldBeUnique`; the dispatcher throws a `LogicException` because the two contracts conflict. Contributed by [@stevebauman](https://github.com/stevebauman) in [\#61169](https://github.com/laravel/framework/pull/61169).

---

### Queue::forward()

`Queue::forward()` reroutes all jobs dispatched to a named queue onto a different queue, connection, or both — with no changes to job classes or dispatch call sites.

```php
Queue::forward('reports', 'reports.fifo', 'cloud'); // rename + move connection
Queue::forward('payments', connection: 'cloud');    // keep name, move connection
Queue::forward('updates', 'notifications');         // rename on same connection

Queue::forward([
    'reports' => 'reports.fifo',
    'emails'  => 'emails.fifo',
], connection: 'cloud');

```

Forwards resolve through the same hook as `Queue::route()`. Contributed by [@jackbayliss](https://github.com/jackbayliss) in [\#61188](https://github.com/laravel/framework/pull/61188).

---

### Process Improvements

- **Iterable process pools** — `ProcessPoolResults` now implements `IteratorAggregate`, so `foreach` loops over exit codes actually work.
- **`ProcessIdleTimedOutException`** — idle timeouts now throw their own exception, separate from `ProcessTimedOutException`, so you can distinguish a hung process from a slow one.
- **New fake assertions** — `assertRanCount(2)`, `assertRanInOrder([...])`, and `recorded()` with a callback filter make process testing more precise.

---

### Eloquent Builder Additions

- `orWhereKey()` and `orWhereKeyNot()` complement the existing `whereKey()` pair for primary-key conditions in `OR` branches.
- `wherePivot()` and `orWherePivot()` now accept a closure scoped to the pivot model, enabling custom pivot scopes in relationship queries.
- `inOrderOf()` accepts enums in its value list, consistent with enum support elsewhere in the query builder.

---

### Queue Worker Visibility

A `JobReleased` event now fires when a job is released back to the queue from middleware such as `WithoutOverlapping` — previously only `JobReleasedAfterException` existed, leaving overlap-triggered releases invisible. Workers also print a notice when a queue is paused or resumes, and report the paused state on startup.

---

### Other Notable Fixes

- Guzzle 8 is now supported alongside Guzzle 7.
- Several Redis cluster hardening fixes: cross-slot reads eliminated, cache tag pruning covers all master nodes, stale-tag infinite loops resolved, and failed pipelines leave the connection usable.
- `throwUnless()` no longer silently skips a case where it should throw.
- Single quotes are correctly escaped in Postgres JSON path attributes.

---

Key Takeaways
-------------

- The `read-through` driver enables zero-downtime, lazy bucket migrations with a two-line config change.
- `#[DebounceFor]` on listeners eliminates redundant reindex or recalculation jobs during high-frequency event bursts.
- `Queue::forward()` lets you restructure queue topology from a service provider without touching job classes.
- Separate idle and wall-clock timeout exceptions make process error handling more precise.
- `orWhereKey()` and closure-based `wherePivot()` clean up common Eloquent query patterns.

---

*Source: [Read-Through Disks and Debounced Listeners in Laravel 13.26 — Laravel News](https://laravel-news.com/laravel-13-26-0)*

 Found this useful?

          [  ](https://twitter.com/intent/tweet?url=https%3A%2F%2Fmsaied.com%2Farticles%2Fread-through-disks-and-debounced-listeners-in-laravel-1326&text=Read-Through+Disks+and+Debounced+Listeners+in+Laravel+13.26) [  ](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fmsaied.com%2Farticles%2Fread-through-disks-and-debounced-listeners-in-laravel-1326) 

 Frequently Asked Questions 
----------------------------

  3 questions  

     Q01  What does the Laravel 13.26 read-through filesystem driver do?        It layers a primary disk over a fallback disk. On the first read of a file, Laravel serves it from the fallback and copies it to the primary, so the primary fills lazily with only the files that are actually accessed. Set `copy =&gt; false` to skip promotion entirely, or `throw_on_promotion_failure =&gt; true` to surface copy errors. 

      Q02  Can a queued listener use both #\[DebounceFor\] and ShouldBeUnique in Laravel 13.26?        No. The dispatcher throws a LogicException if a listener carries both, because ShouldBeUnique keeps the first dispatch while DebounceFor keeps the last — the two contracts are mutually exclusive. 

      Q03  How does Queue::forward() differ from editing job dispatch calls?        Queue::forward() is registered once in a service provider and applies to every job dispatched to the named queue, regardless of where in the codebase the dispatch originates. No job classes or dispatch sites need to be modified. 

  Continue reading

 More Articles 
---------------

 [ View all    ](https://msaied.com/articles) 

 [ ![Object Storage Migrations with Laravel's Read-Through Filesystem](https://cdn.msaied.com/565/f830d15d4a1287d381fa05e631ea2aba.png) Laravel 13 Object Storage S3 

### Object Storage Migrations with Laravel's Read-Through Filesystem

Laravel 13 introduces a read-through filesystem driver that lets you migrate from S3 to R2 without downtime. N...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 18 Aug 2026     4 min read  

  Read    

 ](https://msaied.com/articles/object-storage-migrations-with-laravels-read-through-filesystem) [ ![Livewire v4.4.1 Released: Bug Fixes, Alpine 3.16.2, and Laravel 13 Compatibility](https://cdn.msaied.com/564/c64b65959ad8ade491c78f3482f22996.png) Livewire Laravel Alpine.js 

### Livewire v4.4.1 Released: Bug Fixes, Alpine 3.16.2, and Laravel 13 Compatibility

Livewire v4.4.1 ships 16 fixes and improvements including Alpine.js bumped to 3.16.2, cached computed property...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 18 Aug 2026     3 min read  

  Read    

 ](https://msaied.com/articles/livewire-v441-released-bug-fixes-alpine-3162-and-laravel-13-compatibility) [ ![MySQL EXPLAIN and Query Profiling in Laravel: Finding Slow Queries Before They Hit Production](https://cdn.msaied.com/563/f2d4a7fb0ab45706cf9330746f7b2588.png) laravel mysql performance 

### MySQL EXPLAIN and Query Profiling in Laravel: Finding Slow Queries Before They Hit Production

Learn how to read MySQL EXPLAIN output, use query profiling tools, and integrate them into a Laravel workflow...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 18 Aug 2026     3 min read  

  Read    

 ](https://msaied.com/articles/mysql-explain-and-query-profiling-in-laravel-finding-slow-queries-before-they-hit-production) 

   [  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png)   Mohamed Said Laravel Backend Engineer  ](https://msaied.com)Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

Explore

- [Home](https://msaied.com)
- [Projects](https://msaied.com/projects)
- [Articles](https://msaied.com/articles)
- [Certificates](https://msaied.com/certificates)
- [Contact](https://msaied.com#contact-section)

Connect

- [   hello@msaied.com ](mailto:hello@msaied.com)
- [   +20 109 461 9204 ](tel:+201094619204)

© 2026 Mohamed Said. All rights reserved.

 [  ](https://github.com/EG-Mohamed) [  ](https://www.linkedin.com/in/msaiedm/) [  ](https://wa.me/201094619204) [  ](mailto:hello@msaied.com) [  ](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)
