<?php
namespace App\EventSubscriber;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Garantit l'existence des répertoires d'upload utilisés par l'application
* (champs EasyAdmin FileUploadType/ImageField, services d'upload/export...).
*
* EasyAdmin valide `is_writable()` sur le dossier d'upload au moment de la
* construction du formulaire. Si le dossier est absent (nouveau checkout,
* environnement fraîchement provisionné...), une exception est levée. Cet
* abonné crée les dossiers manquants de façon centralisée et portable, en
* s'appuyant sur %kernel.project_dir% plutôt que sur des chemins absolus.
*/
class UploadDirectorySubscriber implements EventSubscriberInterface
{
/**
* Répertoires d'upload relatifs à la racine du projet.
* Centralisés ici pour éviter toute duplication de chemins dans le code.
*
* @var string[]
*/
private const UPLOAD_DIRECTORIES = [
'public/imagees/galery',
'public/galerie/images',
'public/upload/galerie/images',
'public/upload/galerie/videos',
'public/upload/listEnt',
'public/upload/affectations',
'public/upload/demandes',
'public/upload/modules',
'public/upload/rapportEval',
'public/upload/admin/Excel',
];
private string $projectDir;
private Filesystem $filesystem;
private ?LoggerInterface $logger;
public function __construct(string $projectDir, ?LoggerInterface $logger = null)
{
$this->projectDir = rtrim($projectDir, '/');
$this->filesystem = new Filesystem();
$this->logger = $logger;
}
public function onKernelRequest(RequestEvent $event): void
{
// On ne traite que la requête principale pour éviter tout surcoût inutile.
if (!$event->isMainRequest()) {
return;
}
foreach (self::UPLOAD_DIRECTORIES as $relativeDir) {
$absoluteDir = $this->projectDir.'/'.$relativeDir;
if (is_dir($absoluteDir)) {
continue;
}
try {
// 0755 : accès en écriture au serveur web avec permissions restrictives.
$this->filesystem->mkdir($absoluteDir, 0755);
} catch (IOExceptionInterface $exception) {
// On ne bloque jamais la requête : on trace simplement l'incident.
if (null !== $this->logger) {
$this->logger->error(sprintf(
'Impossible de créer le répertoire d\'upload "%s" : %s',
$absoluteDir,
$exception->getMessage()
));
}
}
}
}
public static function getSubscribedEvents(): array
{
// Priorité élevée pour s'exécuter avant la résolution du contrôleur/formulaire.
return [
KernelEvents::REQUEST => [['onKernelRequest', 30]],
];
}
}