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+jsoncorrectos
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::default → pagination::bootstrap-3, pagination::simple-default → pagination::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()— usarRoute::resource()o definiciones explícitas$request->has()con sintaxis de array — usar$request->hasAny()Model::unguard()— usarModel::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:
- Verificar que tienes PHP 8.3+
- Actualizar
composer.jsoncon las versiones nuevas - Revisar el upgrade guide oficial si tienes codigo que usa los patrones afectados
- 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
- Release Notes | Laravel 13.x — Documentacion oficial
- Upgrade Guide | Laravel 13.x — Documentacion oficial
- Laravel 13 Released — Laravel News
- What We Know About Laravel 13 — Laravel News
- Laravel 13 released: features and upgrade guide — Benjamin Crozat
- Laravel Versions Timeline — laravelversions.com
- PHP Attributes — PHP Manual
