Skip to content

Armazenamento de ficheiros ​

O sistema de armazenamento de ficheiros do Doggy é construído sobre o League Flysystem, com suporte para armazenamento local e armazenamento compatível com S3, fornecendo capacidades de upload de ficheiros, otimização de imagens e geração de URLs.

Visão geral ​

O sistema de armazenamento localiza-se em src/Service/Storage/:

src/Service/Storage/
├── StorageManager.php          # Gestor de armazenamento (seleção de adaptadores)
├── FileUploadService.php       # Serviço de upload de ficheiros
├── FileUrlGenerator.php        # Geração/cache de URLs
├── ImageOptimizerService.php   # Otimização de imagens (biblioteca Imagine)
└── Adapter/
    ├── StorageAdapterInterface.php
    ├── LocalStorageAdapter.php
    └── S3StorageAdapter.php

As entidades relacionadas ficam em src/Entity/Storage/:

EntidadeDescrição
File.phpRegisto de ficheiro
StorageConfig.phpConfiguração de armazenamento (tipo de adaptador, parâmetros, domínio CDN)
UploadSession.phpSessão de upload

Backends de armazenamento ​

BackendAdaptadorCenário de utilização
LocalLocalStorageAdapterAmbiente de desenvolvimento, implementações de pequena escala
AWS S3S3StorageAdapterImplementações em cloud (suporta domínio CDN)

Armazenamento local ​

php
// Armazenamento local predefinido: public/uploads/
$adapter = new LocalStorageAdapter(
    rootPath: '/var/www/public/uploads',
    publicUrl: '/uploads'
);

Armazenamento S3 ​

php
// Armazenamento compatível com S3 (suporta 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',
]);

Upload de ficheiros ​

FileUploadService fornece o fluxo de upload completo:

php
$file = $fileUploadService->upload($uploadedFile, [
    'disk' => 'default',
    'optimize' => true,
    'max_size' => 52428800,  // 50MB
]);

Fluxo de upload:

  1. Dispara o evento FileUploadingEvent (permite interceptar e modificar opções)
  2. Verificação de segurança do ficheiro (tipo, tamanho, extensão, MIME)
  3. Deduplicação por hash SHA-256
  4. Geração do caminho de armazenamento com estratégia por data (Y/m/uuid.ext ou uuid.ext)
  5. Upload para o adaptador
  6. Criação da entidade File
  7. Dispara o evento FileUploadedEvent
  8. Mensagem assíncrona de compressão de imagem (ImageCompressMessage)

Otimização de imagens ​

ImageOptimizerService baseia-se na biblioteca Imagine:

php
$optimizer->optimize($sourcePath, $targetPath, [
    'max_width' => 1920,
    'max_height' => 1080,
    'quality' => 80,
    'format' => 'webp',
]);

Geração de URLs ​

FileUrlGenerator suporta cache e URLs temporários:

php
$url = $urlGenerator->getUrl($file);                          // com cache
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // URL assinado
$urlGenerator->invalidateUrl($file);                          // limpar cache

Interface de administração ​

Entrada: App\Controller\Admin\StorageConfigController

Template: templates/admin/storage/

Código aberto sob MIT | Copyright © 2026 Doggy