dahovitech / media-bundle
Bundle Symfony 7 moderne et hautement configurable pour la gestion des fichiers et médias
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=8.2
- api-platform/core: ^4.0
- doctrine/doctrine-bundle: ^2.10
- doctrine/orm: ^3.0
- intervention/image: ^3.0
- liip/imagine-bundle: ^2.12
- oneup/flysystem-bundle: ^4.12
- symfony/config: ^7.0
- symfony/console: ^7.0
- symfony/dependency-injection: ^7.0
- symfony/form: ^7.0
- symfony/framework-bundle: ^7.0
- symfony/http-foundation: ^7.0
- symfony/http-kernel: ^7.0
- symfony/security-bundle: ^7.0
- symfony/stimulus-bundle: ^2.13
- symfony/twig-bundle: ^7.0
- symfony/ux-turbo: ^2.13
- symfony/validator: ^7.0
- vich/uploader-bundle: ^2.3
Requires (Dev)
- phpunit/phpunit: ^10.0
- symfony/browser-kit: ^7.0
- symfony/css-selector: ^7.0
- symfony/phpunit-bridge: ^7.0
This package is not auto-updated.
Last update: 2025-08-02 16:17:55 UTC
README
Bundle Symfony 7 moderne et hautement configurable pour la gestion des fichiers et médias, avec focus sur la performance, la sécurité et l'expérience utilisateur.
✨ Fonctionnalités
📁 Gestion de fichiers
- Upload multiple avec interface drag & drop moderne (FilePond)
- Support de multiples formats : images (JPG, PNG, GIF, WebP), documents (PDF, DOC, TXT)
- Validation avancée : type MIME, taille, contenu, sécurité
- Métadonnées automatiques : dimensions d'images, informations EXIF, etc.
🖼️ Transformation d'images
- Génération automatique de thumbnails avec LiipImagineBundle
- Formats configurables : thumbnail, medium, large
- Cache optimisé pour des performances maximales
- Support des principaux formats d'images web
☁️ Stockage flexible
- Abstraction de stockage avec OneupFlysystemBundle
- Support multi-providers : local, AWS S3, Google Cloud Storage
- Configuration CDN pour l'optimisation des performances
- Noms de fichiers sécurisés générés automatiquement
🔒 Sécurité avancée
- Validation stricte des types MIME et extensions
- Scan antivirus optionnel (ClamAV)
- Génération de noms sécurisés pour éviter les conflits
- Contrôle d'accès avec médias publics/privés
🌐 API REST complète
- Endpoints CRUD complets avec API Platform
- Upload simple et multiple
- Recherche et filtrage avancés
- Pagination optimisée
- Téléchargement sécurisé
🎨 Interface d'administration
- Interface moderne avec Bootstrap 5
- Vue en grille et liste
- Galerie d'images interactive
- Statistiques détaillées
- Gestion des métadonnées
⚡ Performance
- Cache intelligent pour les transformations d'images
- Lazy loading des images
- Optimisation des requêtes Doctrine
- Support CDN intégré
🛠️ Commandes CLI
- Nettoyage automatique des médias expirés
- Génération de thumbnails en lot
- Statistiques d'utilisation
📦 Installation
1. Installation via Composer
composer require dahovitech/media-bundle
2. Activation du bundle
Si vous utilisez Symfony Flex, le bundle sera automatiquement activé. Sinon, ajoutez-le manuellement dans config/bundles.php
:
<?php return [ // ... DahoviTech\MediaBundle\DahoviTechMediaBundle::class => ['all' => true], // Dépendances requises Vich\UploaderBundle\VichUploaderBundle::class => ['all' => true], Oneup\FlysystemBundle\OneupFlysystemBundle::class => ['all' => true], Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], ];
3. Configuration des dépendances
VichUploaderBundle
# config/packages/vich_uploader.yaml vich_uploader: db_driver: orm mappings: media_files: uri_prefix: /uploads/media upload_destination: '%kernel.project_dir%/public/uploads/media' namer: Vich\UploaderBundle\Naming\UniqidNamer
LiipImagineBundle
# config/packages/liip_imagine.yaml liip_imagine: resolvers: default: web_path: ~ filter_sets: thumbnail: filters: thumbnail: { size: [150, 150], mode: outbound } medium: filters: thumbnail: { size: [400, 400], mode: inset } large: filters: thumbnail: { size: [800, 800], mode: inset }
OneupFlysystemBundle
# config/packages/oneup_flysystem.yaml oneup_flysystem: adapters: local_adapter: local: location: '%kernel.project_dir%/public/uploads' filesystems: media_filesystem: adapter: local_adapter
4. Configuration du bundle
Créez le fichier de configuration :
# config/packages/dahovi_tech_media.yaml dahovi_tech_media: upload_path: '%kernel.project_dir%/public/uploads/media' max_file_size: 10485760 # 10MB allowed_extensions: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'pdf', 'doc', 'docx', 'txt'] image_formats: thumbnail: width: 150 height: 150 mode: crop medium: width: 400 height: 400 mode: resize large: width: 800 height: 800 mode: resize storage: adapter: local # ou 's3', 'gcs' s3: bucket: 'your-bucket' region: 'us-east-1' security: generate_secure_filename: true scan_for_viruses: false mime_types: - 'image/jpeg' - 'image/png' - 'image/gif' - 'image/webp' - 'application/pdf' - 'text/plain' - 'application/msword' - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' cdn: enabled: false url: '' # URL de votre CDN api: enabled: true prefix: '/api/media'
5. Mise à jour de la base de données
php bin/console doctrine:schema:update --force
# ou avec les migrations
php bin/console make:migration
php bin/console doctrine:migrations:migrate
6. Installation des assets
php bin/console assets:install
🚀 Utilisation
Interface d'administration
Accédez à l'interface d'administration via /admin/media
pour :
- Télécharger des fichiers avec drag & drop
- Gérer vos médias (édition, suppression, duplication)
- Visualiser les statistiques
- Rechercher et filtrer vos médias
API REST
Le bundle expose automatiquement une API REST complète :
Endpoints disponibles
GET /api/media
- Liste tous les médiasGET /api/media/{id}
- Récupère un média spécifiquePOST /api/media/upload
- Upload un fichier uniquePOST /api/media/upload/multiple
- Upload multiplePUT /api/media/{id}
- Met à jour un médiaDELETE /api/media/{id}
- Supprime un médiaGET /api/media/search?q=query
- Recherche dans les médias
Exemples d'utilisation
Upload d'un fichier :
const formData = new FormData(); formData.append('file', fileInput.files[0]); formData.append('name', 'Mon image'); formData.append('description', 'Description de l\'image'); fetch('/api/media/upload', { method: 'POST', body: formData }) .then(response => response.json()) .then(media => console.log('Média créé:', media));
Récupération de la liste :
fetch('/api/media?page=1&limit=20&type=image') .then(response => response.json()) .then(data => { console.log('Médias:', data.data); console.log('Pagination:', data.pagination); });
Utilisation dans vos entités
<?php namespace App\Entity; use DahoviTech\MediaBundle\Entity\Media; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] class Article { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; #[ORM\Column(length: 255)] private ?string $title = null; #[ORM\ManyToOne(targetEntity: Media::class)] #[ORM\JoinColumn(nullable: true)] private ?Media $featuredImage = null; // Getters et setters... }
Intégration avec TinyMCE
Le bundle fournit automatiquement un endpoint compatible avec TinyMCE pour l'upload d'images :
tinymce.init({ selector: 'textarea', plugins: 'image', images_upload_url: '/api/media/upload', images_upload_handler: function (blobInfo, success, failure) { const formData = new FormData(); formData.append('file', blobInfo.blob(), blobInfo.filename()); fetch('/api/media/upload', { method: 'POST', body: formData }) .then(response => response.json()) .then(media => success(media.url)) .catch(error => failure('Erreur lors de l\'upload')); } });
Service MediaManager
Utilisez le service MediaManager
dans vos contrôleurs :
<?php namespace App\Controller; use DahoviTech\MediaBundle\Service\MediaManager; use Symfony\Component\HttpFoundation\File\UploadedFile; class MyController extends AbstractController { public function uploadAction(MediaManager $mediaManager, UploadedFile $file) { $media = $mediaManager->createFromUploadedFile( $file, 'Nom du média', 'Description optionnelle', true // public ); return $this->json($media); } }
🛠️ Commandes CLI
Nettoyage des médias expirés
php bin/console dahovi-tech:media:cleanup-expired
Génération des thumbnails
php bin/console dahovi-tech:media:generate-thumbnails
# Avec options
php bin/console dahovi-tech:media:generate-thumbnails --force --filter=thumbnail
Statistiques
php bin/console dahovi-tech:media:statistics
⚙️ Configuration avancée
Configuration Amazon S3
dahovi_tech_media: storage: adapter: s3 s3: bucket: 'your-s3-bucket' region: 'us-west-2' endpoint: '' # Pour S3 compatible (MinIO, etc.)
# config/packages/oneup_flysystem.yaml oneup_flysystem: adapters: s3_adapter: awss3v3: client: aws_s3_client bucket: 'your-s3-bucket' filesystems: media_filesystem: adapter: s3_adapter
Configuration Google Cloud Storage
dahovi_tech_media: storage: adapter: gcs gcs: bucket: 'your-gcs-bucket' project_id: 'your-project-id'
Sécurité renforcée
dahovi_tech_media: security: generate_secure_filename: true scan_for_viruses: true # Nécessite ClamAV mime_types: - 'image/jpeg' - 'image/png' # Liste restrictive des types autorisés
🤝 Contribution
Les contributions sont les bienvenues ! Consultez le guide de contribution pour plus d'informations.
Développement local
git clone https://github.com/dahovitech/media-bundle.git
cd media-bundle
composer install
Tests
php bin/phpunit
📄 Licence
Ce bundle est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
🔗 Liens utiles
💬 Support
Développé avec ❤️ par DahoviTech