Erstellt in app/Exceptions/Media/:
MediaException- Basis-ExceptionMediaNotFoundException- Medium nicht gefundenMediaInUseException- Medium kann nicht gelöscht werden (wird noch verwendet)InvalidMediaFileException- Ungültige Datei (MIME-Type, Größe)MediaStorageException- Storage/Dateisystem-Fehler
Erstellt in app/Events/Media/:
MediaUploaded- Wird nach erfolgreichem Upload gefeuertMediaDeleted- Wird nach Löschung gefeuertMediaReferencesSynced- Wird nach Synchronisation von Referenzen gefeuert
Alle Methoden haben nun explizite Return Types:
public function uploadFile(...): Media
public function createFromExisting(...): Media
public function getUnusedMedia(): Collection
public function getMedia(...): CollectionKritische Operationen (Upload, Move) laufen nun in DB-Transaktionen:
- Bei Fehlern wird automatisch gerollt back
- Dateien werden bei Fehlern aufgeräumt
- Verhindert inkonsistente Zustände
- Exceptions statt
null-Returns - Strukturiertes Logging bei allen wichtigen Operationen
- Cleanup bei Fehlern (orphaned files werden entfernt)
- MIME-Type Whitelist (konfigurierbar über
config/media.php) - Dateigrößen-Limit (Standard: 50MB, konfigurierbar)
- Validierung vor Upload
Neue Config-Datei config/media.php:
allowed_mime_types- Anpassbare MIME-Type Whitelistmax_file_size- Maximale Dateigrößedefault_disk- Standard Storage Diskdefault_collection- Standard Collection
- ✅ Validierung (MIME-Type, Größe)
- ✅ DB-Transaktion
- ✅ Exception Handling
- ✅ Event Dispatching
- ✅ Logging
- ✅ Cleanup bei Fehler
- ✅ DB-Transaktion
- ✅ Rollback bei Fehler (Datei wird zurückverschoben)
- ✅ Exception statt
null - ✅ Event Dispatching
- ✅ Logging
- ✅ Prüfung auf Verwendung
- ✅ Exception wenn in Verwendung
- ✅ Event Dispatching
- ✅ Logging
- ✅ DB-Transaktion
- ✅ Event Dispatching
- ✅ Logging
- ✅ Besseres Exception Handling
- ✅ Cleanup bei Fehler
- ✅ Validierung (keine Medien gefunden)
- ✅ Logging
use App\Exceptions\Media\InvalidMediaFileException;
use App\Exceptions\Media\MediaStorageException;
try {
$media = $mediaService->uploadFile($file, 'images');
} catch (InvalidMediaFileException $e) {
// Ungültige Datei (MIME-Type oder Größe)
return back()->withErrors(['file' => $e->getMessage()]);
} catch (MediaStorageException $e) {
// Storage-Fehler
Log::error('Upload failed', ['error' => $e->getMessage()]);
return back()->withErrors(['file' => 'Upload fehlgeschlagen']);
}use App\Exceptions\Media\MediaInUseException;
try {
$mediaService->deleteMedia($media);
} catch (MediaInUseException $e) {
// Medium wird noch verwendet
return back()->withErrors(['media' => $e->getMessage()]);
}// In EventServiceProvider
protected $listen = [
MediaUploaded::class => [
SendMediaUploadNotification::class,
OptimizeMediaImage::class,
],
MediaDeleted::class => [
ClearMediaCache::class,
],
];In .env:
MEDIA_MAX_FILE_SIZE=52428800 # 50MB in Bytes
MEDIA_DEFAULT_DISK=public
MEDIA_DEFAULT_COLLECTION=defaultIn config/media.php:
'allowed_mime_types' => [
'image/jpeg',
'image/png',
// ... weitere
],- Fehlerbehandlung: Klare, typisierte Exceptions statt unklare
null-Returns - Transaktionssicherheit: Keine inkonsistenten Datenbank/Dateisystem-Zustände
- Erweiterbarkeit: Events ermöglichen Hooks für zusätzliche Logik
- Sicherheit: MIME-Type & Größen-Validierung
- Debugging: Strukturiertes Logging für alle Operationen
- Konfigurierbarkeit: Zentrale Config-Datei
- Type Safety: Vollständige Type-Hints und Return Types
- Testbarkeit: Bessere Testbarkeit durch klare Exceptions
- Breaking Changes: Methoden werfen nun Exceptions statt
nullzurückzugeben - Migration: Bestehender Code muss angepasst werden (Try-Catch-Blöcke)
- Events: Optional - können ignoriert werden wenn nicht benötigt
- Config: Kann in bestehende Config-Struktur integriert werden