Vue d'ensemble
MediaManager
Système complet de gestion de médias construit avec Livewire et Spatie MediaLibrary. Permet d'uploader, gérer et organiser des fichiers médias de manière flexible et réutilisable.
Fonctionnalités principales
Architecture
Structure des fichiers
app/
├── Models/
│ └── TemporaryMedia.php # Modèle pour les médias temporaires
├── Services/MediaManager/
│ └── MediaHub.php # Service central (cerveau du système)
└── Livewire/MediaManager/
├── Upload.php # Composant d'upload
├── Viewer.php # Composant de visualisation
├── Picker.php # Composant modal de sélection
└── Manager.php # Composant de composition
resources/views/livewire/media-manager/
├── upload.blade.php
├── viewer.blade.php
├── picker.blade.php
└── manager.blade.php
config/
└── media-manager.php # Configuration globale
Flux de données
Upload
Fichiers
MediaHub
Service
Viewer
Affichage
Composants
MediaHub (Service)
Le cerveau du système. Gère toute la logique métier pour les médias.
Méthodes principales
list($context, $filters, $perPage)- Lister les médiasstoreUpload($file, $context)- Uploader un fichierdelete($mediaId)- Supprimer un médiaattach($mediaIds, $model, $collection)- Attacher des médiasgetStats($context)- Obtenir les statistiques
Viewer (Composant Livewire)
Composant principal pour l'affichage et la gestion des médias.
Paramètres de configuration
Interface
withSearch- Barre de recherchewithFilters- FiltreswithActions- ActionswithSelection- Sélection
Affichage
layout- Layout (grid/list)columns- Nombre de colonnesperPage- Éléments par page
Upload (Composant Livewire)
Composant pour l'upload de fichiers avec drag & drop.
Fonctionnalités
- • Upload multiple de fichiers
- • Drag & drop
- • Validation des types de fichiers
- • Validation de la taille
- • Prévisualisation des images
- • Barre de progression
Utilisation
Utilisation basique
<!-- Utilisation simple avec les valeurs par défaut -->
<livewire:media-manager.viewer />
Utilisation avancée
<!-- Avec paramètres personnalisés -->
<livewire:media-manager.viewer
:withActions="false"
:withSelection="false"
:withSearch="true"
:withFilters="false"
layout="list"
:columns="2"
:perPage="20"
/>
Dans une page Filament
<!-- resources/views/filament/admin/pages/media-manager.blade.php -->
<div>
<livewire:media-manager.viewer
:withActions="true"
:withSelection="true"
:withSearch="true"
:withFilters="true"
layout="grid"
:columns="4"
:perPage="28"
/>
</div>
Mode sélection uniquement
<!-- Pour un formulaire (mode sélection) -->
<livewire:media-manager.viewer
:withActions="false"
:withSelection="true"
:withSearch="true"
:withFilters="true"
layout="grid"
:columns="3"
:perPage="12"
/>
Configuration
Fichier de configuration
Le fichier config/media-manager.php contient toutes les options de configuration.
<?php
return [
'per_page' => [
'default' => env('MEDIA_MANAGER_PER_PAGE', 28),
'viewer' => env('MEDIA_MANAGER_VIEWER_PER_PAGE', 20),
'picker' => env('MEDIA_MANAGER_PICKER_PER_PAGE', 20),
],
'layout' => [
'default' => env('MEDIA_MANAGER_LAYOUT', 'grid'),
'columns' => env('MEDIA_MANAGER_COLUMNS', 5),
],
'features' => [
'search' => true,
'filters' => true,
'actions' => true,
'selection' => true,
'uploader' => true,
'stats' => true,
],
'upload' => [
'max_files' => env('MEDIA_MANAGER_MAX_FILES', 10),
'max_size_mb' => env('MEDIA_MANAGER_MAX_SIZE_MB', 10),
'allowed_types' => ['image/*', 'video/*', 'audio/*', 'application/pdf'],
],
];
Variables d'environnement
MEDIA_MANAGER_PER_PAGE- Éléments par pageMEDIA_MANAGER_LAYOUT- Layout par défautMEDIA_MANAGER_COLUMNS- Nombre de colonnesMEDIA_MANAGER_MAX_FILES- Fichiers max par uploadMEDIA_MANAGER_MAX_SIZE_MB- Taille max par fichier
Fonctionnalités
search- Barre de recherchefilters- Filtres avancésactions- Boutons d'actionselection- Sélection multipleuploader- Composant d'uploadstats- Statistiques
Exemples pratiques
Exemple 1 : Galerie d'images simple
<!-- Galerie d'images en mode grille -->
<livewire:media-manager.viewer
:withActions="false"
:withSelection="false"
:withSearch="true"
:withFilters="true"
layout="grid"
:columns="4"
:perPage="16"
/>
Exemple 2 : Interface d'administration complète
<!-- Interface complète avec toutes les fonctionnalités -->
<livewire:media-manager.viewer
:withActions="true"
:withSelection="true"
:withSearch="true"
:withFilters="true"
layout="grid"
:columns="5"
:perPage="20"
/>
Exemple 3 : Sélecteur de médias pour formulaire
<!-- Mode sélection pour formulaire -->
<livewire:media-manager.viewer
:withActions="false"
:withSelection="true"
:withSearch="true"
:withFilters="true"
layout="grid"
:columns="3"
:perPage="12"
/>
API Reference
MediaHub API
list(array $context, array $filters = [], ?int $perPage = null)
Récupère une liste paginée de médias
•
$context - Contexte (filter, collection, sessionId, deduplicate)•
$filters - Filtres (search, type, min_size, max_size, visibility)•
$perPage - Nombre d'éléments par pageRetour : LengthAwarePaginator
storeUpload(UploadedFile $file, array $context)
Upload un fichier et retourne le média créé
•
$file - Fichier uploadé•
$context - Contexte d'uploadRetour : Media
delete(int $mediaId)
Supprime un média
•
$mediaId - ID du média à supprimerRetour : bool
attach(array $mediaIds, Model $model, string $collection)
Attache des médias temporaires à un modèle
•
$mediaIds - IDs des médias•
$model - Modèle cible•
$collection - Collection de destinationRetour : int (nombre de médias attachés)
Viewer API
Méthodes publiques
selectAll()- Sélectionner toutdeselectAll()- Désélectionner touttoggleSelection($id)- Toggle sélectiondeleteSelected()- Supprimer sélectionsetLayout($layout)- Changer layoutsortBy($field)- Trier par champ
Propriétés publiques
$withSearch- Barre de recherche$withFilters- Filtres$withActions- Actions$withSelection- Sélection$layout- Layout actuel$selected- Médias sélectionnés
Dépannage
Problèmes courants
Les paramètres ne sont pas pris en compte
Si vos paramètres withSearch, withActions, etc. ne fonctionnent pas :
- • Vérifiez que la méthode
mount()ne surcharge pas vos valeurs par défaut - • Assurez-vous que les paramètres sont passés correctement dans la vue Blade
- • Vérifiez la configuration dans
config/media-manager.php
Erreur "Snapshot missing"
Cette erreur survient avec les composants Livewire imbriqués :
- • Ajoutez un
wire:keyunique à chaque composant Livewire - • Utilisez
wire:key="media-viewer-"
Médias privés non accessibles
Si les médias privés ne s'affichent pas :
- • Vérifiez que la route
/media/{id}est définie - • Assurez-vous que le middleware d'authentification est configuré
- • Vérifiez la propriété
visibilitydes médias
Bonnes pratiques
- • Utilisez des
wire:keyuniques pour tous les composants Livewire imbriqués - • Testez vos paramètres avec des tests unitaires
- • Utilisez la configuration globale pour les valeurs par défaut
- • Surchargez les paramètres au niveau du composant quand nécessaire
- • Documentez vos configurations personnalisées
Tests recommandés
// Test des paramètres par défaut
it('respects default parameters', function () {
$viewer = new Viewer();
$viewer->mount();
expect($viewer->withSearch)->toBeFalse();
expect($viewer->withActions)->toBeTrue();
});
// Test de surcharge des paramètres
it('can override parameters', function () {
$viewer = new Viewer();
$viewer->mount(withSearch: true, withActions: false);
expect($viewer->withSearch)->toBeTrue();
expect($viewer->withActions)->toBeFalse();
});