Saltar al contenido principal
En junio de 2026, Laravel Cloud pasó a soportar aplicaciones Symfony, y en Forge se añadieron caché Valkey gestionada y almacenamiento de objetos. En el framework llegaron actualizaciones sustanciosas como despacho de jobs en bloque, soporte de pooler de Postgres, y cliente/servidor MCP. Fuente: Laravel June Product Updates

Laravel Framework

Bus::bulk() — despacho de jobs en bloque

Ahora es posible registrar un gran número de jobs con un único INSERT a la base de datos. Como el INSERT en bloque se realiza por conexión de cola, se elimina el coste de INSERT uno a uno.
use Illuminate\Support\Facades\Bus;

Bus::bulk([
    new ProcessOrder($order1),
    new ProcessOrder($order2),
    new ProcessOrder($order3),
    // Eficiente incluso con miles de elementos
]);

Soporte del pooler de transacciones de Postgres

El framework soporta ahora, a nivel de framework, poolers de conexiones de Postgres en modo transacción como PgBouncer, AWS RDS Proxy o Neon.
// config/database.php
'pgsql' => [
    'driver' => 'pgsql',
    'pooled' => true,  // Declarar que la conexión va a través del pooler
    // ...
],
Cuando necesites conexión directa para operaciones de esquema o sentencias DDL, añade ::direct al nombre de la conexión para saltarte el pooler. DB::connection('pgsql::direct')->statement('CREATE INDEX ...')
El framework realiza automáticamente los emulated prepares, el boolean binding y todo lo que el pooler requiera.

Soporte de cliente y herramientas de servidor MCP

Los agentes de IA de Laravel pueden ahora usar herramientas de servidores MCP remotos (por HTTP) y de clases de servidor MCP locales. La conversión de esquemas, el wrapping y las invocaciones se procesan todas automáticamente.
class MyAgent extends Agent
{
    public function tools(): array
    {
        return [
            // Usar herramientas de un servidor MCP remoto
            McpClient::tools('https://mcp.example.com'),
            // Usar herramientas de un servidor MCP local
            McpServer::tools(MyMcpServer::class),
        ];
    }
}

Comando artisan dev

Se ha añadido artisan dev, que arranca todos los procesos de desarrollo con un único comando. Servidor, workers de cola, tail de logs y Vite operan simultáneamente con salidas codificadas por colores.
php artisan dev
// Registrar comandos adicionales en un service provider
use Illuminate\Foundation\Console\DevCommands;

DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to ' . config('app.url'))->green();
Detecta automáticamente los gestores de paquetes de Node.js (npm, yarn, pnpm, bun). Es la convención oficial de Artisan que sustituye al tradicional script composer dev.

Soporte de metadatos de rutas

Se ha añadido el método ->metadata() para asignar metadatos arbitrarios a las rutas. Es totalmente compatible con la caché de rutas, y los metadatos definidos en un grupo se fusionan con las rutas hijas.
Route::metadata(['head' => ['robots' => ['noindex'], 'author' => 'Taylor']])
    ->group(function () {
        Route::get('/users', [UserController::class, 'index'])
            ->metadata(['head' => ['title' => 'Users']]);
    });

// Acceso desde controladores o middlewares
$request->route()->getMetadata('head.title');          // 'Users'
$request->route()->getMetadata('head.author', 'Taylor'); // 'Taylor'

Excepciones que no reintentan

Ahora puedes evitar reintentos para excepciones cuya reintentación no tiene sentido (entrada inválida, fallos externos permanentes, etc.).
// Definido directamente en la clase de excepción
class InvalidInputException extends RuntimeException
{
    public function retry(): bool
    {
        return false;
    }
}

// También configurable en bootstrap/app.php
->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontRetry(InvalidInputException::class);
})

Flag —without-migration-data para schema:dump

schema:dump puede ahora generar un volcado puro de estructura omitiendo las filas de la tabla de migraciones.
php artisan schema:dump --without-migration-data

Corrección de zona horaria en between()/unlessBetween()

Independientemente del orden en que llames a timezone() antes de between() o unlessBetween(), la programación funciona ahora con la zona horaria correcta.
// Ambos comportamientos son iguales (antes, si escribías between primero, se acababa usando UTC)
$schedule->command('foo')->timezone('Europe/Rome')->between('10:00', '12:00');
$schedule->command('foo')->between('10:00', '12:00')->timezone('Europe/Rome');

Otros cambios del framework

  • Soporte de traits en Bus::bulk(): puedes definir atributos de cola en traits
  • Índices vectoriales de MariaDB: soporte de índices vectoriales en MariaDB
  • Helper attachFromStorage(): añadir archivos adjuntos desde storage al MailMessage de notificaciones
  • Cache::rememberWithState(): soporte de caché con estado
  • Driver de mantenimiento para tests en paralelo: con el driver array, cada proceso puede tener su propio estado de mantenimiento independiente
  • whenFilledEnum(): procesamiento condicional de campos usando Enum
  • Soporte de anyOf de JSON Schema: se puede usar anyOf de JSON Schema en la validación

Inertia

  • Client\Request::uri(): obtener la URI de la petición cliente
  • Soporte del atributo target de anchor: se puede usar target="_blank" y similares en el componente <Link>
  • Opción async de formulario: soporte de envío asíncrono en el componente de formulario
  • Información de página en titleCallback: se pasa la información de la página al callback de título

Laravel Cloud y Laravel Forge

ProductoActualizaciones principales
Laravel CloudSoporte completo de aplicaciones Symfony (Symfony 7.4 LTS y 8.x, compatible con PHP 8.2–8.5), despliegue y pagos desde Stripe Projects, configuración de notificaciones por Slack/email por miembro del equipo
Laravel ForgeCaché Valkey gestionada (creación y gestión desde el dashboard), almacenamiento de objetos gestionado, rediseño de emails de notificación
Última modificación el 13 de julio de 2026