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.
composer require dahovitech/media-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],
];
# 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
# 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 }
# config/packages/oneup_flysystem.yaml
oneup_flysystem:
adapters:
local_adapter:
local:
location: '%kernel.project_dir%/public/uploads'
filesystems:
media_filesystem:
adapter: local_adapter
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'
php bin/console doctrine:schema:update --force
# ou avec les migrations
php bin/console make:migration
php bin/console doctrine:migrations:migrate
php bin/console assets:install
Accédez à l'interface d'administration via /admin/media pour :
Le bundle expose automatiquement une API REST complète :
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édiasUpload 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);
});
<?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...
}
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'));
}
});
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);
}
}
php bin/console dahovi-tech:media:cleanup-expired
php bin/console dahovi-tech:media:generate-thumbnails
# Avec options
php bin/console dahovi-tech:media:generate-thumbnails --force --filter=thumbnail
php bin/console dahovi-tech:media:statistics
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
dahovi_tech_media:
storage:
adapter: gcs
gcs:
bucket: 'your-gcs-bucket'
project_id: 'your-project-id'
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
Les contributions sont les bienvenues ! Consultez le guide de contribution pour plus d'informations.
git clone https://github.com/dahovitech/media-bundle.git
cd media-bundle
composer install
php bin/phpunit
Ce bundle est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
Développé avec ❤️ par DahoviTech
How can I help you explore Laravel packages today?