🎃 12 meses por 75 €

El plan anual a mitad de precio hasta el 31 de octubre.

Aprovechar la oferta

🎃 Halloween: 12 meses por 75 €

Plan anual a mitad de precio, para altas y renovaciones. Solo hasta el 31 de octubre.
Aprovechar la oferta
Saltar al contenido
Curso Actualizar un proyecto de Laravel 11 a Laravel 12
08/09 La actualización a Laravel 12 El disco local en storage/app/private: qué pasa con los adjuntos al actualizar a Laravel 12
Tu lectura Quedan 12 min
Lección 8 de 9 · La actualización a Laravel 12

El disco local en storage/app/private: qué pasa con los adjuntos al actualizar a Laravel 12

12 min de lectura 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:

Terminal
sail artisan tinker --execute="dump(Storage::disk('local')->path(''))"
sail artisan tinker --execute="dump(Storage::disk('local')->exists(App\Models\Attachment::first()->path))"
Salida
"/var/www/html/storage/app/" // vendor/psy/psysh/src/ExecutionClosure.php(41) : eval()'d code:1 true // vendor/psy/psysh/src/ExecutionClosure.php(41) : eval()'d code:1

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:

Terminal
ls storage/app
Salida
attachments public

attachments es la carpeta de los adjuntos, y public la del disco public, la que storage:link enlaza desde public/storage.

Lo que queda de esta lección
  1. 02config:publish filesystems y su diff
  2. 03El adjunto que ya no se encuentra
  3. 04Los tests no lo ven
  4. 05storage/app frente a storage/app/private
  5. 06La decisión: conservar storage/app
  6. 07composer qa en verde y el commit
Sigue leyendo con tu suscripción El curso completo, con el certificado y el foro, está incluido en la suscripción. Ver los planes