Laravel

Descubre las novedades de Laravel 13

Autorangel cruz
Publicado
Lectura8 min de lectura
Actualizado
Descubre las novedades de Laravel 13

Laravel 13 fue lanzado oficialmente el 17 de marzo de 2026. Actualicé este artículo con todas las novedades confirmadas tras el lanzamiento. Si lo leíste antes, vas a encontrar bastante información nueva: el AI SDK de primera parte, soporte JSON:API, búsqueda vectorial y passkeys son los titulares que no estaban antes.

Fecha de lanzamiento

Laravel 13 salió el 17 de marzo de 2026, cumpliendo la tradición de releases anuales en el primer trimestre. El soporte oficial es el siguiente:

Versión PHP Lanzamiento Bug fixes hasta Seguridad hasta
11 8.2–8.4 Mar 2024 Sep 2025 Mar 2026
12 8.2–8.5 Feb 2025 Ago 2026 Feb 2027
13 8.3–8.5 17 Mar 2026 Q3 2027 17 Mar 2028

PHP 8.3 como mínimo

Este sigue siendo el único breaking change real que afectará a la mayoría. Laravel 13 requiere PHP 8.3 como mínimo, abandonando el soporte para PHP 8.2.

# Versiones PHP que soporta Laravel 13
PHP 8.3
PHP 8.4
PHP 8.5

Soltar PHP 8.2 no es solo una decision administrativa: permite usar readonly classes, typed class constants y #[\Override] de forma nativa, sin polyfills. El paquete symfony/polyfill-php83 fue eliminado de las dependencias. Las primeras mediciones muestran mejoras de 5–10% en velocidad solo por ese motivo.

Si tu servidor todavía corre PHP 8.2, tendrás que quedarte en Laravel 12 o actualizar el runtime primero.

Laravel AI SDK — primera parte, estable en producción

Esta es la novedad más grande de Laravel 13 y no estaba en los primeros reportes pre-lanzamiento. Laravel incluye ahora un SDK de inteligencia artificial de primera parte (laravel/ai) que llega estable con esta versión.

El SDK ofrece una interfaz unificada, agnóstica del proveedor, para:

  • Generación de texto y agentes con tool-calling
  • Generación de imágenes
  • Síntesis de audio
  • Generación de embeddings
  • Integración con vector stores

La filosofía es la misma de siempre en Laravel: abstraer la complejidad y que el código sea expresivo sin importar si usas OpenAI, Anthropic u otro proveedor por debajo.

PHP Attributes — ahora en 15+ ubicaciones

El artículo original cubría los Attributes en modelos y jobs. Con el lanzamiento oficial, la cobertura es mucho más amplia: más de 15 ubicaciones en el framework.

Attributes en modelos Eloquent

use Illuminate\Database\Eloquent\Attributes\Table;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
 
#[Table('posts')]
#[Fillable('title', 'body', 'published_at')]
#[Hidden('internal_notes')]
class Post extends Model
{
    //
}

Attributes en Queue Jobs

use Illuminate\Queue\Attributes\Connection;
use Illuminate\Queue\Attributes\Queue;
use Illuminate\Queue\Attributes\Tries;
use Illuminate\Queue\Attributes\Backoff;
use Illuminate\Queue\Attributes\Timeout;
 
#[Connection('redis')]
#[Queue('orders')]
#[Tries(3)]
#[Backoff(60)]
#[Timeout(120)]
class ProcessOrder implements ShouldQueue
{
    //
}

Attributes en controladores

use Illuminate\Routing\Attributes\Middleware;
use Illuminate\Auth\Attributes\Authorize;
 
#[Middleware('throttle:api')]
#[Authorize('view-dashboard')]
class DashboardController extends Controller
{
    //
}

Los Attributes también están disponibles en console commands, form requests, API resources, listeners, mailables, notifications, factories y test seeders. No es un cambio breaking: ambas formas (properties y Attributes) funcionan. Puedes migrar gradualmente o no migrar nunca.

Soporte JSON:API de primera parte

Laravel 13 introduce clases de recursos JSON:API nativas que manejan:

  • Serialización de objetos de respuesta
  • Inclusión de relaciones
  • Sparse fieldsets
  • Links
  • Headers Content-Type: application/vnd.api+json correctos

Esto elimina la necesidad de paquetes de terceros como laravel-json-api o frappe/laravel-json-api para proyectos que consumen este estándar.

Queue routing centralizado por clase

En lugar de definir la conexión y la cola dentro de cada job, ahora puedes centralizar todo eso en un service provider:

use App\Jobs\ProcessPodcast;
use Illuminate\Support\Facades\Queue;
 
Queue::route(ProcessPodcast::class, connection: 'redis', queue: 'podcasts');

Menos repetición, configuración en un solo lugar. Una mejora pequeña pero muy práctica en proyectos con muchos jobs.

Búsqueda vectorial / semántica con pgvector

Laravel 13 agrega soporte nativo para búsqueda vectorial usando PostgreSQL y la extensión pgvector:

DB::table('documents')
    ->whereVectorSimilarTo('embedding', 'Las mejores bodegas de la Rioja')
    ->limit(10)
    ->get();

El ORM se encarga de construir la query. Muy relevante si estás construyendo aplicaciones con RAG (Retrieval-Augmented Generation) o cualquier búsqueda semántica.

Cache::touch() para extender TTL sin re-almacenar

Pequeña pero útil. Cache::touch() extiende el tiempo de expiración de un item en caché sin necesidad de obtenerlo ni re-almacenarlo:

// Extiende el TTL 60 minutos más sin leer ni escribir el valor
Cache::touch('session_data', now()->addMinutes(60));

Antes tenías que hacer esto:

$data = Cache::get('session_data');
Cache::put('session_data', $data, now()->addMinutes(60));

Con Cache::touch() eliminas el round-trip innecesario. Funciona en todos los drivers: Redis, Memcached, Database y File. Retorna true si la clave existe o false si no la encuentra.

Passkey authentication

Soporte para passkeys integrado directamente en los starter kits y en Laravel Fortify. Ya no necesitas un paquete separado para implementar autenticación sin contraseña basada en WebAuthn/FIDO2.

Server-Sent Events con Response::eventStream()

return response()->eventStream(function () {
    foreach ($events as $event) {
        yield $event;
    }
});

Un método nativo en ResponseFactory para streaming de eventos desde el servidor al cliente. Útil para notificaciones en tiempo real sin la complejidad de WebSockets cuando la comunicación es unidireccional.

Breaking changes

Laravel 13 tiene pocos breaking changes reales pero hay varios que conviene revisar antes de migrar.

Alto impacto

PHP 8.2 eliminado. El único breaking change que afectará a la mayoría.

Dependencias en composer.json que debes actualizar:

laravel/framework ^13.0
laravel/tinker ^3.0
phpunit/phpunit ^12.0
pestphp/pest ^4.0

CSRF middleware renombrado. VerifyCsrfToken ahora se llama PreventRequestForgery. También agrega verificación de origen via el header Sec-Fetch-Site. Los aliases antiguos están deprecados, no eliminados, así que no romperá inmediatamente, pero conviene actualizar.

Deserialización de objetos en caché restringida por defecto. Si almacenas objetos PHP en caché, ahora necesitas allowlistear explícitamente las clases permitidas en la configuración. Una medida de seguridad correcta.

Impacto medio

Prefijos de caché y Redis cambiaron de formato: de guión bajo (app_cache_) a guión (app-cache-). Si usas prefijos, define CACHE_PREFIX, REDIS_PREFIX y SESSION_COOKIE explícitamente en .env para evitar que las claves existentes queden huérfanas.

Nombre de la cookie de sesión: ahora usa Str::snake() en lugar de Str::slug(). Revisa si tienes algo que dependa del nombre exacto de esa cookie.

Bajo impacto

Model::boot() no puede instanciar el mismo modelo. Ya no se pueden crear nuevas instancias del modelo dentro de su propio boot(). Si tienes ese patrón, lanzará LogicException. Hay que refactorizar esa lógica.

Rutas con dominio se registran primero que las rutas sin dominio, mejorando la consistencia en la resolución.

Nombres de vistas de paginación cambiaron: pagination::defaultpagination::bootstrap-3, pagination::simple-defaultpagination::simple-bootstrap-3.

Eventos de cola cambiaron: JobAttempted::$exceptionOccurred (bool) ahora es $exception (object|null). QueueBusy::$connection ahora es $connectionName.

Container::call() ahora respeta los defaults de parámetros nullable (retorna null en vez de intentar resolver un binding).

MySQL DELETE con JOIN ahora incluye cláusulas ORDER BY y LIMIT. Puede surfacear un QueryException en MySQL/MariaDB si tenías queries que dependían del comportamiento anterior.

Tablas pivot polimórficas: los nombres de tabla ahora se pluralizan para modelos pivot personalizados. Agrega la propiedad $table explícita para evitar problemas.

Métodos eliminados

Estos métodos estaban deprecados desde L11/L12 y ahora fueron removidos:

  • Route::controller() — usar Route::resource() o definiciones explícitas
  • $request->has() con sintaxis de array — usar $request->hasAny()
  • Model::unguard() — usar Model::preventSilentlyDiscardingAttributes()
  • El patrón app/Http/Kernel.php — fue deprecado en L11 y ahora está completamente eliminado

Resumen de novedades

Caracteristica Estado
PHP 8.3 minimo Confirmado (breaking change)
Laravel AI SDK (laravel/ai) Nuevo — primera parte
PHP Attributes en 15+ ubicaciones Confirmado
Soporte JSON:API nativo Nuevo
Queue routing centralizado por clase Nuevo
Busqueda vectorial con pgvector Nuevo
Cache::touch() Confirmado
Passkey authentication Nuevo
Server-Sent Events nativo Nuevo
Restriccion en Model::boot() Breaking change menor
Symfony 7.4 / 8.0 Confirmado
CSRF middleware renombrado Breaking change menor

Migracion desde Laravel 12

La estimacion oficial es aproximadamente 10 minutos para la mayoria de aplicaciones. Si tienes Laravel Boost instalado, puedes usar el comando /upgrade-laravel-v13 directamente desde tu editor (funciona con Claude Code, Cursor y VS Code). Tambien esta disponible el upgrade automatizado via LaravelShift.

Los pasos manuales basicos son:

  1. Verificar que tienes PHP 8.3+
  2. Actualizar composer.json con las versiones nuevas
  3. Revisar el upgrade guide oficial si tienes codigo que usa los patrones afectados
  4. Correr composer update

Preguntas frecuentes

¿Cuando salio Laravel 13?

El 17 de marzo de 2026, siguiendo la tradicion de Q1 releases del framework.

¿Que version de PHP necesito para Laravel 13?

PHP 8.3 como minimo. Tambien soporta PHP 8.4 y 8.5. Si estas en PHP 8.2 tendras que quedarte en Laravel 12 o actualizar el runtime primero.

¿Los PHP Attributes reemplazan las propiedades de clase en los modelos?

No, son una alternativa opcional. Puedes seguir usando $fillable, $hidden, $table exactamente como antes. Los Attributes son otra forma de hacer lo mismo, no un reemplazo obligatorio.

¿La migracion desde Laravel 12 es complicada?

En principio no. El principal requisito es PHP 8.3. El resto de cambios son aditivos o cambios menores. Los puntos que pueden requerir atencion son el prefijo de cache, el CSRF middleware renombrado y la restriccion en Model::boot().

¿Cache::touch() funciona con todos los drivers de cache?

Si. Cache::touch() es compatible con Redis, Memcached, Database y File.

¿El Laravel AI SDK requiere un proveedor especifico?

No. Es agnóstico del proveedor. Puedes usarlo con OpenAI, Anthropic u otros sin cambiar el código de tu aplicación.


Referencias

Bio
Angel Cruz

Desarrollador web full-stack enfocado en React, buenas prácticas y código abierto. Apasionado por construir productos útiles y compartir lo aprendido en el camino.