La API de imágenes first-party de Laravel cubría la escritura desde la 13.20 — subida, transformación y almacenamiento en un disco —, pero servir una imagen redimensionada por HTTP exigía código repetitivo: llamar a toBytes(), construir la respuesta y fijar el content-type a mano. Laravel 13.25 lo resuelve con tres novedades.
Primero, Image ahora implementa el contrato Responsable: una instancia de imagen es un valor de retorno válido desde una ruta o controlador. El framework llama a toResponse(), ejecuta el pipeline de forma perezosa, devuelve los bytes con un 200 y fija el Content-Type según la salida producida — un JPEG almacenado pero servido como WebP devuelve correctamente image/webp. Al ser perezosa, la transformación solo se ejecuta cuando realmente se piden los bytes.
La respuesta por defecto no incluye cabeceras de caché. Llamar a toResponse($request) manualmente devuelve una Illuminate\Http\Response, con lo que setMaxAge(), setPublic(), setEtag() y el resto de la API quedan disponibles. Para tráfico real, el artículo recomienda generar el archivo derivado una sola vez y servirlo después desde el disco, incluyendo el timestamp updated_at del modelo en el nombre del archivo para que las fotos actualizadas generen nuevas rutas sin invalidar caché.
Segundo, toFormat() ahora es público y acepta directamente webp, jpg, jpeg, png, gif, avif, heic, heif (normalizado a heic) y bmp — se acabaron los bloques match para formatos provenientes de la petición. Un valor inválido lanza una ImageException (un 500, no un 404), por lo que se aconsejan restricciones de ruta o validación. Esto hace muy cortos los endpoints AVIF con fallback junto al elemento <picture>.
Tercero, Image::fromStream() crea una instancia desde un recurso stream, por ejemplo Storage::disk('s3')->readStream($path). La lectura es perezosa; un stream vacío lanza «Invalid stream image data.» al ejecutarse el pipeline. El método complementa fromPath(), fromStorage(), fromUpload(), fromUrl(), fromBytes() y fromBase64() para handles como php://input o archivos leídos desde archivos comprimidos.
El artículo cierra con un endpoint completo: ancho validado (limitado entre 32 y 2000) y formato, lectura en stream desde S3, escalado, conversión, calidad 80 y caché pública de un año — todo protegido con una ruta firmada para impedir que alguien genere variantes arbitrarias a costa de tu factura de almacenamiento. Los tres cambios fueron contribuidos por Caleb White en los PR #61111, #61109 y #61110 del framework.
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.