Laravel 13.30 se publicó el 2 de septiembre de 2026 con nuevos métodos de colección, un endurecimiento de las rutas de Storage, diagnósticos de workers y varias correcciones.
$products->chunkBy('parent');
collect([1, 1, 2, 2, 1, 1])->chunkBy(fn ($value) => $value);
// [[1, 1], [2, 2], [1, 1]]chunkBy() convierte el patrón más común de chunkWhile() en un método propio: inicia un nuevo chunk cuando cambia el valor resuelto de una clave o callback. Como la clave se resuelve mediante data_get(), también funcionan notaciones de punto como chunkBy('address.city'), y cada chunk resultante conserva sus claves de array originales. Contribución de @JosephSilber en el PR #61357.
Storage::path() ya no omite la normalización de rutas. Todas las demás llamadas al sistema de archivos pasan por el driver Flysystem, que lanza PathTraversalDetected cuando una ruta sale de la raíz del disco. path() entregaba antes la cadena en bruto al PathPrefixer de Flysystem: en el disco local por defecto, path('../../../.env') devolvía una ruta nativa al .env de la aplicación mientras get() y delete() rechazaban el mismo argumento. path() ahora aplica WhitespacePathNormalizer antes del prefijado; el código que dependía de segmentos .. lanzará una excepción.
queue:work escribe el motivo de parada del worker como última línea, por ejemplo "Worker STOPPED Memory limit exceeded", y con --json emite un registro estructurado con level, status, reason, exit_code, jobs_processed, memory y timestamp. El enum WorkerStopReason ganó un método description() que cubre nueve escenarios de salida, de interrupted a job timed out. Con --quiet o --silent no se escribe nada.
DevCommands recibe dos filtros opcionales: withoutVendorCommands() descarta los comandos registrados desde vendor/ y withoutDefaultCommands() los del framework (serve, queue:listen, pail, Vite). Los comandos de la aplicación no se tocan; el filtrado usa el mismo valor de origen que DevCommands ya rastreaba para colisiones de nombres.
Los DSN nativos sqlsrv: para Microsoft SQL Server se detectan ahora antes del parseo de URL y los procesa un parser dedicado que extrae host, puerto, base de datos y opciones PDO_SQLSRV como Encrypt, TrustServerCertificate, MultiSubnetFailover, ApplicationIntent y LoginTimeout. Antes, parse_url() interpretaba todo el DSN como una ruta y corrompía la configuración. La convención sqlsrv://user:pass@host:port/database sigue funcionando.
Artisan::commandNamed('app:my-command') devuelve una instancia de comando o null sin construir todos los comandos registrados, a diferencia de Artisan::all(). La cola de Laravel Cloud implementa totalPendingSize(), totalDelayedSize() y totalReservedSize() sumando sobre managedQueues(); SQS devuelve 0 porque no puede enumerar las colas.
Entre las correcciones: route:cache restaura la aplicación de fachadas tras el bootstrap de su copia desechable (antes las fachadas apuntaban a un contenedor descartado, causando LogicException bajo php artisan optimize), Request::clamp() recurre al valor por defecto ante entradas no numéricas en lugar de un 500, db:seed restaura la conexión por defecto con try/finally, setVisibility() resuelve mediante readerFor() en discos read-through, Queue::createPayloadUsing() ya no requiere una conexión resuelta, los tooltips de la página de excepciones se renderizan con allowHTML: false por defecto, los includes JSON:API anidados se resuelven en el nivel correcto, spl_object_id() sustituye a spl_object_hash() en el contenedor y el builder de Eloquent, y un arreglo para la expansión cuadrática de reglas wildcard fue portado a 12.x.




Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.