Laravel 13.21 se etiquetó el 21 de julio de 2026 junto con el parche del mismo día, 13.21.1, que solo incrementa la constante interna de versión del framework sin añadir cambios funcionales, por lo que ambas versiones se tratan aquí como una sola.
La novedad principal es un atributo de clase #[RouteKey] para modelos Eloquent. Antes, personalizar la columna usada en la vinculación implícita de modelos de ruta requería sobrescribir el método getRouteKeyName(). Ahora basta con declarar #[RouteKey('slug')] sobre la definición de la clase, siguiendo el mismo patrón que ya usan #[ObservedBy] y #[ScopedBy]. Si no hay atributo, getRouteKeyName() sigue recurriendo a la clave primaria. Contribución de nimnaherath en el pull request #60841.
Se añade una nueva regla de validación base64 a las comprobaciones de formato de cadena del validador, cubriendo un hueco que bibliotecas como Zod ya resolvían. Verifica que un valor sea una cadena Base64 válida según la RFC 4648, exigiendo una decodificación en modo estricto que, al recodificarse, produzca exactamente la misma cadena; así, errores de relleno o caracteres extraños hacen fallar la validación. Contribución de lucasmichot en la PR #60808.
Un nuevo atributo contextual #[RequestAttribute] permite inyectar directamente como parámetro tipado valores que antes se guardaban en la bolsa de atributos de la petición (por ejemplo, un tenant u organización resuelto por un middleware), sin llamar manualmente a $request->attributes->get(). Un ejemplo muestra #[RequestAttribute('org')] Organization $org en un método InventoryController::index(). Contribución de cosmastech en la PR #60847.
El componente Image, introducido en Laravel 13.20, solo admitía conversión a WebP, JPG y JPEG, pese a que la biblioteca Intervention Image incluida soporta más formatos. Laravel 13.21 añade los métodos fluidos toPng(), toGif(), toAvif() y toBmp(). La versión también corrige Image::extension(), que carecía del mapeo MIME image/avif y generaba erróneamente extensiones .bin para salidas AVIF. Contribución de Tresor-Kasenda en la PR #60713.
Application::configure() fijaba antes la clase ApplicationBuilder de forma rígida, obligando a los paquetes que extienden la clase Application de Laravel a sobrescribir todo el método para cambiarla. Una nueva propiedad protected static $applicationBuilder permite ahora a las subclases indicar su propio constructor manteniendo la API de configuración existente (PR #60848).
El componente Illuminate\Concurrency obtiene su propio subsplit de Git de solo lectura, sumándose a otros componentes Illuminate ya publicados como paquetes independientes (PR #60836).
Otras correcciones: los callbacks de rollback de transacciones de base de datos ahora se disparan correctamente (#60777); se reconoce un nuevo patrón de mensaje de conexión perdida para activar reconexiones automáticas (#60819); Grammar::whereColumn() ahora escapa los signos de interrogación (#60832); los mensajes de InvalidPayloadException incluyen el nombre del job y la cola (#60799); pasar un enum a LogManager::forgetChannel() ya no lanza un TypeError (#60801); RedisTaggedCache::decrement() admite claves de tipo enum (#60821); Str::wordWrap() maneja correctamente cadenas multibyte (#60814); el caché de atributos contextuales ya no colisiona entre propiedades de una misma clase (#60815); los parámetros falsy en excepciones de concurrencia se conservan (#60822); se corrige el análisis del puerto de host en el comando serve (#60828); y se resuelve un índice indefinido en Pipeline\Hub::pipe() (#60802).