El disco local en storage/app/private: qué pasa con los adjuntos al actualizar a Laravel 12
Hola, bienvenido. En esta lección vamos a adoptar el último archivo de configuración del esqueleto de Laravel 12, config/filesystems.php, el que dejamos fuera en la lección anterior. En el esqueleto de Laravel 12, el disco local guarda los archivos en storage/app/private y no en storage/app, y si publicamos el archivo tal cual, los adjuntos que los clientes ya han subido dejan de encontrarse. Ningún test lo detecta, y por eso le dedicamos una lección completa.
La guía oficial lo menciona en "Local Filesystem Disk Default Root Path", con impacto bajo, y en la lección 6 lo descartamos: ese cambio solo afecta a los proyectos cuyo config/filesystems.php no define el disco local, y el nuestro lo define. El problema llega por otro camino, al sincronizar el archivo con el esqueleto, que es lo que recomienda la sección "Miscellaneous". Vamos a ver qué cambia, qué pasaría con los adjuntos y qué decidiremos para el proyecto.
Dónde guarda el proyecto los adjuntos
Cuando un cliente abre un ticket con adjuntos, App\Actions\StoreAttachments guarda cada archivo con $file->store("attachments/{$ticket->id}", 'local'), es decir, en la carpeta attachments/<id del ticket> del disco local, y registra en la tabla attachments la ruta relativa que devuelve store(). Para descargarlo, AttachmentController comprueba la policy y lo sirve con Storage::disk('local')->download(). La ruta guardada en la base de datos es relativa a la raíz del disco, y esa raíz es lo que va a cambiar.
Para seguir la lección necesitas al menos un adjunto. Si en la lección 1 abriste un ticket con un adjunto, ya lo tienes, y si no, entra como [email protected] y abre uno ahora. Vamos a comprobar con tinker dónde está la raíz del disco y si Laravel encuentra el primer adjunto:
La raíz es storage/app (/var/www/html es la carpeta del proyecto dentro del contenedor de Sail), y el adjunto está donde dice la base de datos. En el disco, desde la raíz del proyecto:
attachments es la carpeta de los adjuntos, y public la del disco public, la que storage:link enlaza desde public/storage.
- 02config:publish filesystems y su diff
- 03El adjunto que ya no se encuentra
- 04Los tests no lo ven
- 05storage/app frente a storage/app/private
- 06La decisión: conservar storage/app
- 07composer qa en verde y el commit