> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Actualización de Laravel — Octubre de 2026

> Las actualizaciones de Laravel 13 y los productos oficiales en octubre de 2026. Rutas QUERY, protección frente a lecturas obsoletas de réplicas, tareas programadas en un único servidor, aserciones de fakes por propiedades, la integración con Resend en Cloud y los avisos de actualización de PHP en Forge.

En octubre de 2026 llegaron funciones para controlar cómo se expresan las peticiones, a dónde van las lecturas de la base de datos y cómo se ejecutan las tareas programadas en varios servidores. Laravel Cloud simplificó el envío de correo y la configuración de comandos programados, y Forge facilitó el seguimiento de las actualizaciones de seguridad de PHP y de los fallos de aprovisionamiento.

Esta página es un registro mensual basado en la entrada oficial del blog "Laravel October Product Updates", publicada el 4 de noviembre, y en las entradas de octubre del changelog oficial del Framework. Las fuentes primarias se revisaron el 7 de noviembre de 2026, y la sección del Framework cubre solo Laravel 13. No incluye las versiones de noviembre.

Fuentes:

* [Laravel October Product Updates](https://laravel.com/blog/laravel-october-product-updates)
* [Laravel Framework changelog — October 2026](https://laravel.com/framework/docs/changelog#log-2026-10)
* [Laravel Framework changelog RSS](https://laravel.com/rss/oss-changelog)

## Laravel Framework

### Versiones publicadas en octubre

Además de las principales novedades del changelog oficial, se comprobaron las fechas y las versiones en las notas de versión.

| Versión | Publicación | Cambios principales |
| - | - | - |
| [v13.35.0](https://github.com/laravel/framework/releases/tag/v13.35.0) | 6 de octubre | Aserción de propiedades en fakes, memoria del worker en porcentaje, respuestas Markdown, `alwaysOnOneServer()`, rutas QUERY. |
| [v13.36.0](https://github.com/laravel/framework/releases/tag/v13.36.0) | 13 de octubre | Ejecución OLAP en Vitess, builders para reglas de validación existentes. |
| [v13.37.0](https://github.com/laravel/framework/releases/tag/v13.37.0) | 16 de octubre | Opción strict de `Rule::numeric()`, corrección de la condición de carrera al combinar `onOneServer()` y `withoutOverlapping()`. |
| [v13.38.0](https://github.com/laravel/framework/releases/tag/v13.38.0) | 20 de octubre | `PreventStaleDatabaseReads`, `Connection::usingWritePdo()`. |
| [v13.39.0](https://github.com/laravel/framework/releases/tag/v13.39.0) | 27 de octubre | `RefreshDatabase` revierte todos los niveles de transacción tras cada prueba, corrección de `assertSeeText('0')` que pasaba por error. |

A continuación se detallan los nueve elementos del changelog oficial. Para correcciones menores y cambios de dependencias, consulta cada nota de versión.

### Definir búsquedas con cuerpo de petición mediante rutas QUERY

En v13.35.0 se añadió `Route::query()`, compatible con el método HTTP `QUERY`. Puedes definir rutas que reciben las condiciones de búsqueda en el cuerpo de la petición en lugar de la cadena de consulta de GET.

```php theme={null}
use App\Http\Controllers\SearchProductsController;
use Illuminate\Support\Facades\Route;

Route::query('/products/search', SearchProductsController::class);
```

`Route::any()` también coincide con las peticiones QUERY, y la lista de rutas reconoce este método. El `SearchProductsController` de arriba representa un controlador invocable de tu aplicación que implementa la búsqueda.

> [!WARNING]
>
> Las rutas QUERY del grupo de middleware `web` están sujetas a la verificación CSRF. No asumas que puedes omitir la verificación como en GET por tratarse de una búsqueda. Envía el token CSRF.

Fuente principal: [Register QUERY Routes](https://laravel.com/framework/docs/changelog#october-2026-register-query-routes), [routing.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/routing.md#available-router-methods). Páginas relacionadas: [Rutas](https://kawax.biz/es/routing.md), [Protección CSRF](https://kawax.biz/es/csrf.md)

### Evitar lecturas obsoletas también en peticiones posteriores a una escritura

En bases de datos con lectura y escritura separadas, una lectura justo después de una actualización puede ir a una réplica de lectura que aún no se ha sincronizado. La opción existente `sticky` solo cubre la misma petición. El middleware `PreventStaleDatabaseReads` de v13.38.0 protege además las peticiones posteriores de la misma sesión durante un periodo.

En `bootstrap/app.php`, importa `Illuminate\Foundation\Http\Middleware\PreventStaleDatabaseReads` y añádelo dentro del callback de `withMiddleware()` con `$middleware->web(append: [PreventStaleDatabaseReads::class]);`. No se activa automáticamente.

El middleware registra en la sesión la hora de las escrituras en la conexión de base de datos predeterminada. Por defecto, envía las lecturas de esa conexión a la base de datos de escritura durante 2 segundos tras una escritura. Puedes cambiar el periodo registrando, por ejemplo, `PreventStaleDatabaseReads::for(5)` en lugar de la clase.

```mermaid theme={null}
sequenceDiagram
    participant User as Usuario
    participant App as Aplicación<br>Laravel
    participant Session as Sesión
    participant Write as Write DB
    participant Read as Read replica
    User->>App: Petición de actualización
    App->>Write: Escribir datos
    App->>Session: Registrar hora de escritura
    User->>App: Siguiente petición de la misma sesión
    App->>Session: Comprobar el tiempo desde la escritura
    alt Dentro del periodo de 2 segundos
        App->>Write: Leer datos
    else Tras el periodo
        App->>Read: Usar el destino de lectura habitual
    end
```

Como usa la sesión, debe ejecutarse después de `StartSession`. No cambia las lecturas de otras sesiones ni de otras conexiones de base de datos, y tampoco detecta cuándo termina de sincronizarse la réplica.

Fuente principal: [Avoid Stale Reads After Database Writes](https://laravel.com/framework/docs/changelog#october-2026-avoid-stale-reads-after-database-writes), [database.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#preventing-stale-database-reads). Páginas relacionadas: [Base de datos](https://kawax.biz/es/database.md), [Sesión](https://kawax.biz/es/session.md)

### Leer de la base de datos de escritura solo en operaciones concretas

`Connection::usingWritePdo()`, añadido también en v13.38.0, cambia el destino de lectura de la conexión a la base de datos de escritura solo mientras se ejecuta el callback. Es útil cuando quieres que la aplicación indique explícitamente qué lecturas son críticas, en lugar de proteger toda una sesión.

```php theme={null}
use Illuminate\Support\Facades\DB;

$users = DB::connection()->usingWritePdo(
    fn ($connection) => $connection->table('users')->get()
);
```

También se aplica a las consultas de Eloquent y de relaciones que usan la misma conexión. Devuelve el resultado del callback y restaura la configuración de lectura anterior incluso si se lanza una excepción, de modo que el cambio no se arrastra al código posterior.

Fuente principal: [Temporarily Read from the Write Database Connection](https://laravel.com/framework/docs/changelog#october-2026-temporarily-read-from-the-write-database-connection), [database.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#using-the-write-connection-for-reads)

### Configurar en bloque la ejecución de tareas en un único servidor

Para reducir los olvidos de `onOneServer()` al ejecutar el planificador en varios servidores, en v13.35.0 se añadió `Schedule::alwaysOnOneServer()`. Llámalo en `boot()` de `AppServiceProvider` para aplicarlo de una vez a todas las tareas programadas afectadas.

```php theme={null}
use Illuminate\Support\Facades\Schedule;

Schedule::alwaysOnOneServer();
```

Este valor predeterminado solo se aplica cuando lo llamas. Los closures programados sin nombre quedan excluidos y siguen ejecutándose en cada servidor.

> [!NOTE]
>
> `onOneServer()` requiere una caché central compartida por todos los servidores. Los drivers que indica la documentación oficial son `database`, `memcached`, `dynamodb` y `redis`. Añadir la configuración no proporciona por sí solo una infraestructura de bloqueo entre servidores.

Fuente principal: [Run Scheduled Tasks on One Server by Default](https://laravel.com/framework/docs/changelog#october-2026-run-scheduled-tasks-on-one-server-by-default), [scheduling.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/scheduling.md#running-tasks-on-one-server). Página relacionada: [Programación de tareas](https://kawax.biz/es/scheduling.md)

### Verificar despachos en fakes indicando propiedades

Desde v13.35.0, los fakes de Queue, Bus, Event y Notification aceptan un array de propiedades esperadas. Ya no necesitas escribir un callback cada vez solo para comparar atributos.

Por ejemplo, con un job `ShipOrder` que tiene una propiedad pública `order` y un `$order` preparado en la prueba, puedes verificarlo así:

```php theme={null}
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Queue;

Queue::fake();

ShipOrder::dispatch($order);

Queue::assertPushed(ShipOrder::class, ['order' => $order]);
```

Todas las propiedades indicadas deben coincidir. Los valores se comparan de forma estricta, pero los modelos de Eloquent se comparan con `is()`, así que también coincide otra instancia que represente el mismo modelo. Los fakes verifican el despacho, no el resultado de ejecutar el job.

Fuente principal: [Assert Fake Dispatches by Their Properties](https://laravel.com/framework/docs/changelog#october-2026-assert-fake-dispatches-by-their-properties), [queues.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/queues.md#testing). Páginas relacionadas: [Colas](https://kawax.biz/es/queues.md), [Mocking](https://kawax.biz/es/mocking.md)

### Indicar el límite de memoria del worker en porcentaje

Desde v13.35.0, la opción `--memory` de `queue:work` acepta un porcentaje del `memory_limit` de PHP. Puedes ajustar el umbral de salida del worker a la configuración de PHP sin recalcular un valor fijo en MB para cada entorno.

```shell theme={null}
php artisan queue:work --memory=60%
```

No es un porcentaje de la memoria total del host o del contenedor. Si el `memory_limit` de PHP es ilimitado (`-1`), usa un valor en MB en lugar de un porcentaje. El reinicio de un worker que termina al alcanzar el umbral queda a cargo de un supervisor de procesos como Supervisor.

Fuente principal: [Set Queue Worker Memory Limits as Percentages](https://laravel.com/framework/docs/changelog#october-2026-set-queue-worker-memory-limits-as-percentages), [queues.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/queues.md#resource-considerations)

### Devolver Markdown con un Content-Type propio

En v13.35.0 se añadió `markdown()` a la factoría de respuestas. Devuelve un cuerpo Markdown como `text/markdown`, y también puedes indicar el código de estado y cabeceras adicionales.

```php theme={null}
return response()->markdown("# Report\n\nMonthly summary", 200, [
    'Cache-Control' => 'no-store',
]);
```

Puedes combinarlo con lógica que elige el formato de respuesta, como `wantsMarkdown()`. No convierte Markdown a HTML. Es una API para servir el propio Markdown como respuesta.

Fuente principal: [Return Markdown Responses](https://laravel.com/framework/docs/changelog#october-2026-return-markdown-responses), [responses.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/responses.md#markdown-responses). Página relacionada: [Respuestas](https://kawax.biz/es/responses.md)

### Ejecutar consultas analíticas en modo OLAP con Vitess

En v13.36.0 se añadieron `isVitess()` y `olap()` a las conexiones MySQL. Puedes detectar si usas Vitess o PlanetScale y ejecutar consultas analíticas con la carga de trabajo OLAP.

```php theme={null}
use Illuminate\Support\Facades\DB;

$totals = DB::connection('mysql')->olap(
    fn ($connection) => $connection->table('orders')
        ->selectRaw('customer_id, sum(total) as total')
        ->groupBy('customer_id')
        ->get()
);
```

Configura la carga de trabajo en las conexiones de lectura y de escritura y vuelve a OLTP al terminar el callback. También se restaura si hay excepciones, y en una conexión MySQL normal sin Vitess el callback se ejecuta sin cambiar la carga de trabajo.

Fuente principal: [Use OLAP Workloads with Vitess Connections](https://laravel.com/framework/docs/changelog#october-2026-use-olap-workloads-with-vitess-connections), [database.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/database.md#running-analytical-queries-on-vitess)

### Encontrar reglas de validación existentes mediante builders

En v13.36.0 se añadieron métodos builder de `Rule` para muchas reglas que antes se escribían como cadenas. Métodos como `requiredWith()`, `acceptedIf()`, `regex()` y `timezone()` son más fáciles de encontrar con el autocompletado del IDE, y puedes elegir el estilo sin cambiar el comportamiento de validación existente.

```php theme={null}
use Illuminate\Validation\Rule;

$rules = [
    'nickname' => [Rule::requiredWith('email'), Rule::regex('/^[a-z]+$/i')],
    'terms' => [Rule::acceptedIf('account_type', 'business')],
    'timezone' => [Rule::timezone()],
];
```

Los nombres de los métodos están en camel case. Puedes mezclarlos con reglas en cadena, así que no hace falta reescribir todas las reglas existentes de una vez.

Fuente principal: [Discover More Validation Rules Through Builders](https://laravel.com/framework/docs/changelog#october-2026-discover-more-validation-rules-through-builders), [validation.md oficial de Laravel 13](https://github.com/laravel/docs/blob/f7a20c401a30827991659174d48d958f92517a9e/validation.md#rule-builders). Página relacionada: [Validación](https://kawax.biz/es/validation.md)

## Laravel Cloud

El blog mensual oficial presenta estos tres elementos.

| Función | Novedad |
| - | - |
| Integración con Resend | Al conectar una cuenta de Resend a tu organización, Cloud importa los dominios de envío y muestra los registros DNS necesarios y el estado de verificación. Al conectar el recurso de correo a un entorno, Cloud emite una clave de API y configura `RESEND_API_KEY`, `MAIL_MAILER`, `MAIL_FROM_ADDRESS` y `MAIL_FROM_NAME`. |
| Cloud scheduler | Las aplicaciones en cualquier lenguaje compatible con Cloud pueden ejecutar comandos programados sin instalar cron ni mantener un proceso del planificador en ejecución. Puedes usar presets o expresiones cron propias y revisar en Logs la salida, el código de salida y la duración de cada ejecución. |
| Comprobación del estado de los dominios | Cloud comprueba cada hora que el DNS de los dominios conectados apunta a Cloud y el estado de renovación de los certificados SSL. Los problemas aparecen en el canvas del entorno y también se notifican por correo y Slack. |

Fuente principal: [Laravel October Product Updates — Laravel Cloud](https://laravel.com/blog/laravel-october-product-updates#laravel-cloud), [Laravel Cloud changelog](https://laravel.com/cloud/docs/changelog). Página relacionada: [Presentación de Laravel Cloud](https://kawax.biz/es/blog/laravel-cloud.md)

## Laravel Forge

* **Avisos de actualizaciones de seguridad de PHP**: Forge muestra, para cada servidor, las versiones afectadas por las versiones de seguridad de PHP de octubre y si hay versiones corregidas disponibles. Con **Recheck versions** vuelves a comprobar la versión realmente instalada. Volver a comprobar lo que se muestra y actualizar PHP son operaciones distintas.
* **Gestión de los fallos de aprovisionamiento**: los servidores que no pueden completarse se muestran en estado fallido, con notificaciones, indicaciones sobre los siguientes pasos y una acción de eliminación. La instalación de PHP y Nginx también se reintenta antes de dar el fallo por confirmado.

El blog mensual también menciona la publicación de un post-mortem que repasa la respuesta de seguridad de PHP y Node.js de octubre. Para conocer las medidas tomadas y cómo decidir las actualizaciones, consulta los avisos oficiales.

Fuente principal: [Laravel October Product Updates — Laravel Forge](https://laravel.com/blog/laravel-october-product-updates#laravel-forge), [Laravel Forge changelog](https://laravel.com/forge/docs/changelog)

## Artículos relacionados

> [card] [Actualización de septiembre de 2026](https://kawax.biz/es/blog/changelog/202609.md)
>
> Un repaso a la construcción de proveedores de IA en tiempo de ejecución, las extensiones de búsqueda, Mercure y los entornos de vista previa aislados en Cloud.

> [card] [Guía de base de datos](https://kawax.biz/es/database.md)
>
> Repasa la separación de lectura y escritura y los fundamentos de las conexiones de base de datos.


## Related topics

- [Actualización de Laravel — Septiembre de 2026](https://kawax.biz/es/blog/changelog/202609.md)
- [Actualización de Laravel — Julio de 2026](https://kawax.biz/es/blog/changelog/202607.md)
- [Actualización de Laravel — Agosto de 2026](https://kawax.biz/es/blog/changelog/202608.md)
- [Actualización de Laravel — Marzo de 2026](https://kawax.biz/es/blog/changelog/202603.md)
- [Actualización de Laravel — Mayo de 2026](https://kawax.biz/es/blog/changelog/202605.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.