laravellaravel-13actualizacionnovedad

Novedades de Laravel 13 — Todo lo que cambia en la nueva versión

Novedades de Laravel 13 — Todo lo que cambia en la nueva versión

Laravel 13 llega siguiendo la cadencia anual del framework: una nueva versión mayor cada año en los primeros meses. Después de que Laravel 12 pusiera el foco en los starter kits modernos y la integración con Inertia 2, la versión 13 consolida esos cambios y añade mejoras en el núcleo del framework, herramientas de desarrollo y el ecosistema de pruebas.

En este artículo repasamos los cambios más relevantes para que sepas qué esperar si actualizas un proyecto existente o empiezas uno nuevo.

PHP 8.3 como versión mínima

El cambio más directo y que afecta antes de tocar una sola línea de código: Laravel 13 requiere PHP 8.3 o superior.

# Verificar tu versión de PHP
php --version
# PHP 8.3.x o superior para Laravel 13

PHP 8.3 trajo mejoras que Laravel aprovecha en su núcleo:

// Typed class constants (PHP 8.3)
class Status
{
    const string ACTIVE   = 'active';
    const string INACTIVE = 'inactive';
}

// json_validate() nativo (PHP 8.3)
if (json_validate($jsonString)) {
    $data = json_decode($jsonString, true);
}

// readonly en propiedades de clases anónimas
$obj = new readonly class('Laravel 13') {
    public function __construct(public string $name) {}
};

Si tienes PHP 8.2, necesitarás actualizarlo antes de usar Laravel 13.

Starter kits modernizados

Laravel 13 mantiene y amplía los starter kits introducidos en Laravel 12, con actualizaciones a las versiones más recientes de cada tecnología:

# Nuevo proyecto con starter kit React
laravel new mi-proyecto --using=react

# Con Vue
laravel new mi-proyecto --using=vue

# Con Livewire
laravel new mi-proyecto --using=livewire

# API pura (sin frontend)
laravel new mi-proyecto --using=api

Los starter kits ahora incluyen:

  • React 19 con soporte completo para Server Components
  • Vue 3.5+ con la API de composición mejorada
  • Livewire 3 como opción fullstack sin JavaScript complejo
  • Inertia.js 2.x como capa de comunicación entre Laravel y el frontend

Mejoras en Eloquent

whereAny y whereAll más expresivos

// Buscar registros donde ALGUNO de los campos coincida
User::whereAny(['name', 'email', 'username'], 'like', '%juan%')->get();

// Buscar registros donde TODOS los campos cumplan la condición
Product::whereAll(['price', 'cost'], '>', 0)->get();

// Encadenables con otras condiciones
User::whereAny(['name', 'email'], 'like', "%$search%")
    ->where('active', true)
    ->get();

Casting mejorado con AsCollection y AsEnumCollection

// En el modelo
protected function casts(): array
{
    return [
        'tags'     => AsCollection::class,
        'statuses' => AsEnumCollection::of(Status::class),
    ];
}

// Uso
$user->tags->push('laravel');           // Collection
$order->statuses->contains(Status::Pending); // EnumCollection

explain() para debugging de queries

// Ver el plan de ejecución de una query Eloquent
$query = User::where('active', true)->with('posts');
dd($query->explain());
// Devuelve el EXPLAIN de MySQL/PostgreSQL directamente

Nuevos helpers y funciones globales

// str()->wrap() — envolver un string
str('Laravel')->wrap('[', ']');  // [Laravel]

// Number::spell() — número en palabras
Number::spell(13);         // "thirteen"
Number::spell(13, 'es');   // "trece"

// Arr::from() — crear array desde distintas fuentes
Arr::from(collect([1, 2, 3]));  // [1, 2, 3]
Arr::from(new ArrayObject([1])); // [1]

// rescue() mejorado con valor por defecto tipado
$value = rescue(fn() => riskyOperation(), default: 'fallback');

Artisan: nuevos comandos

# Crear un Data Transfer Object
php artisan make:dto CreateUserDto

# Crear un Value Object
php artisan make:value-object Money

# Listar todos los jobs registrados
php artisan queue:list

# Nuevo comando para revisar configuración de entorno
php artisan env:check

# Limpiar todo de golpe (caché, config, rutas, vistas)
php artisan optimize:clear

Testing: mejoras en Pest y PHPUnit

Laravel 13 actualiza el andamiaje de tests y añade helpers:

// Test de arquitectura con Pest (nuevo helper)
arch()->expect('App\Models')
    ->toExtend(Illuminate\Database\Eloquent\Model::class)
    ->toHaveMethod('casts');

// assertModelMissing ahora acepta closure
$this->assertModelMissing(User::class, fn($q) => $q->where('email', 'test@test.com'));

// Nuevos matchers de JSON
$response->assertJsonPath('data.*.id', [1, 2, 3]);
$response->assertJsonCount(3, 'data');
$response->assertJsonStructure([
    'data' => [['id', 'name', 'email']]
]);

Mejoras en el scheduler

El scheduler de tareas gana más flexibilidad:

// routes/console.php
use Illuminate\Support\Facades\Schedule;

// Nuevo: skipWithoutOverlapping()
Schedule::command('reports:generate')
    ->daily()
    ->skipWithoutOverlapping()   // No encola si la anterior sigue corriendo
    ->onFailure(function () {
        Notification::send($admin, new ScheduleFailedNotification());
    });

// Nuevo: runInBackground() encadenado
Schedule::job(new HeavyJob())->hourly()->runInBackground();

// Nuevo: timezone por comando individual
Schedule::command('tasks:process')
    ->daily()
    ->timezone('Europe/Madrid');

Soporte actualizado

Laravel 13 tiene el siguiente ciclo de soporte:

VersiónPHP mínimoLanzamientoCorrecciones de bugsParches de seguridad
118.2Marzo 2024Agosto 2025Febrero 2026
128.2Febrero 2025Agosto 2026Febrero 2027
138.3Marzo 2026Septiembre 2027Marzo 2028

Si tienes un proyecto en Laravel 11, ten en cuenta que el soporte de correcciones de bugs ya terminó en agosto de 2025.

¿Cómo actualizar a Laravel 13?

# 1. Actualiza composer.json
# "laravel/framework": "^13.0"
# "php": "^8.3"

# 2. Actualiza PHP a 8.3+ si no lo has hecho

# 3. Corre el update
composer update

# 4. Revisa los breaking changes en el upgrade guide
# https://laravel.com/docs/13.x/upgrade

# 5. Ejecuta los tests
php artisan test

Laravel mantiene compatibilidad hacia atrás en la mayoría de los casos, así que la migración desde Laravel 12 suele ser sencilla. La de Laravel 11 requiere más atención.

Conclusión

Laravel 13 es una versión que refina y consolida el trabajo de las versiones anteriores. Los cambios más importantes son el requisito de PHP 8.3, las mejoras en Eloquent con los nuevos métodos de consulta, y la actualización de los starter kits. Si estás empezando un proyecto nuevo en 2026, usa Laravel 13 directamente. Si tienes uno en producción en Laravel 12, la migración es sencilla; desde Laravel 11, planifícala con calma.