Almacenamiento de archivos
El sistema de almacenamiento de archivos de Doggy está construido sobre League Flysystem y admite almacenamiento local y compatible con S3, ofreciendo capacidades como subida de archivos, optimización de imágenes y generación de URLs.
Descripción general
El sistema de almacenamiento se encuentra en src/Service/Storage/:
src/Service/Storage/
├── StorageManager.php # Gestor de almacenamiento (selección de adaptador)
├── FileUploadService.php # Servicio de subida de archivos
├── FileUrlGenerator.php # Generación de URLs / caché
├── ImageOptimizerService.php # Optimización de imágenes (librería Imagine)
└── Adapter/
├── StorageAdapterInterface.php
├── LocalStorageAdapter.php
└── S3StorageAdapter.phpLas entidades relacionadas están en src/Entity/Storage/:
| Entidad | Descripción |
|---|---|
File.php | Registro de archivos |
StorageConfig.php | Configuración de almacenamiento (tipo de adaptador, parámetros, dominio CDN) |
UploadSession.php | Sesión de subida |
Backends de almacenamiento
| Backend | Adaptador | Escenario de uso |
|---|---|---|
| Local | LocalStorageAdapter | Entorno de desarrollo, despliegues de pequeña escala |
| AWS S3 | S3StorageAdapter | Despliegue en la nube (soporta dominio CDN) |
Almacenamiento local
php
// Almacenamiento local por defecto: public/uploads/
$adapter = new LocalStorageAdapter(
rootPath: '/var/www/public/uploads',
publicUrl: '/uploads'
);Almacenamiento S3
php
// Almacenamiento compatible con S3 (soporta AWS, MinIO, Alibaba Cloud OSS, etc.)
$adapter = new S3StorageAdapter([
'access_key' => '...',
'secret_key' => '...',
'region' => 'us-east-1',
'bucket' => 'doggy-files',
'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com',
'cdn_domain' => 'https://cdn.example.com',
]);Subida de archivos
FileUploadService ofrece el flujo completo de subida:
php
$file = $fileUploadService->upload($uploadedFile, [
'disk' => 'default',
'optimize' => true,
'max_size' => 52428800, // 50MB
]);Flujo de subida:
- Se lanza el evento
FileUploadingEvent(permite interceptar y modificar opciones) - Comprobación de seguridad del archivo (tipo, tamaño, extensión, MIME)
- Deduplicación mediante hash SHA-256
- Generación de la ruta de almacenamiento según una estrategia por fecha (
Y/m/uuid.extouuid.ext) - Subida al adaptador
- Creación de la entidad File
- Se lanza el evento
FileUploadedEvent - Mensaje asíncrono de compresión de imagen (
ImageCompressMessage)
Optimización de imágenes
ImageOptimizerService se basa en la librería Imagine:
php
$optimizer->optimize($sourcePath, $targetPath, [
'max_width' => 1920,
'max_height' => 1080,
'quality' => 80,
'format' => 'webp',
]);Generación de URLs
FileUrlGenerator admite caché y URLs temporales:
php
$url = $urlGenerator->getUrl($file); // con caché
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // URL firmada
$urlGenerator->invalidateUrl($file); // limpiar cachéInterfaz de administración
Entrada: App\Controller\Admin\StorageConfigController
Plantilla: templates/admin/storage/