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

v1.0.0 2025-08-01 17:45 UTC

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édias
  • GET /api/media/{id} - Récupère un média spécifique
  • POST /api/media/upload - Upload un fichier unique
  • POST /api/media/upload/multiple - Upload multiple
  • PUT /api/media/{id} - Met à jour un média
  • DELETE /api/media/{id} - Supprime un média
  • GET /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