src/EventSubscriber/UploadDirectorySubscriber.php line 54

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Psr\Log\LoggerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
  6. use Symfony\Component\Filesystem\Filesystem;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. /**
  10.  * Garantit l'existence des répertoires d'upload utilisés par l'application
  11.  * (champs EasyAdmin FileUploadType/ImageField, services d'upload/export...).
  12.  *
  13.  * EasyAdmin valide `is_writable()` sur le dossier d'upload au moment de la
  14.  * construction du formulaire. Si le dossier est absent (nouveau checkout,
  15.  * environnement fraîchement provisionné...), une exception est levée. Cet
  16.  * abonné crée les dossiers manquants de façon centralisée et portable, en
  17.  * s'appuyant sur %kernel.project_dir% plutôt que sur des chemins absolus.
  18.  */
  19. class UploadDirectorySubscriber implements EventSubscriberInterface
  20. {
  21.     /**
  22.      * Répertoires d'upload relatifs à la racine du projet.
  23.      * Centralisés ici pour éviter toute duplication de chemins dans le code.
  24.      *
  25.      * @var string[]
  26.      */
  27.     private const UPLOAD_DIRECTORIES = [
  28.         'public/imagees/galery',
  29.         'public/galerie/images',
  30.         'public/upload/galerie/images',
  31.         'public/upload/galerie/videos',
  32.         'public/upload/listEnt',
  33.         'public/upload/affectations',
  34.         'public/upload/demandes',
  35.         'public/upload/modules',
  36.         'public/upload/rapportEval',
  37.         'public/upload/admin/Excel',
  38.     ];
  39.     private string $projectDir;
  40.     private Filesystem $filesystem;
  41.     private ?LoggerInterface $logger;
  42.     public function __construct(string $projectDir, ?LoggerInterface $logger null)
  43.     {
  44.         $this->projectDir rtrim($projectDir'/');
  45.         $this->filesystem = new Filesystem();
  46.         $this->logger $logger;
  47.     }
  48.     public function onKernelRequest(RequestEvent $event): void
  49.     {
  50.         // On ne traite que la requête principale pour éviter tout surcoût inutile.
  51.         if (!$event->isMainRequest()) {
  52.             return;
  53.         }
  54.         foreach (self::UPLOAD_DIRECTORIES as $relativeDir) {
  55.             $absoluteDir $this->projectDir.'/'.$relativeDir;
  56.             if (is_dir($absoluteDir)) {
  57.                 continue;
  58.             }
  59.             try {
  60.                 // 0755 : accès en écriture au serveur web avec permissions restrictives.
  61.                 $this->filesystem->mkdir($absoluteDir0755);
  62.             } catch (IOExceptionInterface $exception) {
  63.                 // On ne bloque jamais la requête : on trace simplement l'incident.
  64.                 if (null !== $this->logger) {
  65.                     $this->logger->error(sprintf(
  66.                         'Impossible de créer le répertoire d\'upload "%s" : %s',
  67.                         $absoluteDir,
  68.                         $exception->getMessage()
  69.                     ));
  70.                 }
  71.             }
  72.         }
  73.     }
  74.     public static function getSubscribedEvents(): array
  75.     {
  76.         // Priorité élevée pour s'exécuter avant la résolution du contrôleur/formulaire.
  77.         return [
  78.             KernelEvents::REQUEST => [['onKernelRequest'30]],
  79.         ];
  80.     }
  81. }