Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4] Listener pour vider cache LiipImagine

    17 septembre 2019 à 18:01:13

    Hello !

    J'utilise LiipImagineBundle pour afficher mes images dans différentes dimensions.

    J'ai une entité User qui possède une relation OneToOne avec l'entité Avatar ( qui permet d'upload une image grâce à VichUploader).

    Dans ma page de profil j'arrive à afficher tout ça.

    Le but est que lorsque l'utilisateur modifie son avatar, ça supprime la précédente image du cache de LiipImagineBundle.

    J'ai donc fait un test déjà sur mon contrôleur comme ceci :

    if ($form->isSubmitted() && $form->isValid()) {
    
                if ($user->getAvatar()->getImageFile() instanceof UploadedFile) {
                    $cacheManager->remove($helper->asset($user->getAvatar(), 'imageFile'));
                }
    
                $manager->persist($user);
                $manager->flush();
    
                $this->addFlash(
                    'success',
                    'Profil mis à jour !'
                );
            }

    Et ça fonctionne très bien.

    Donc j'ai voulu faire évoluer la méthode en utilisant un listener, déclaré comme service :

    Services.yaml:

      App\Listener\ImageCacheSubscriber:
        tags:
          - { name: doctrine.event_subscriber }

    ImageCacheSubscriber.php:


    <?php
    
    namespace App\Listener;
    
    use App\Entity\Avatar;
    use Doctrine\Common\EventSubscriber;
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use Doctrine\ORM\Event\PreUpdateEventArgs;
    use Liip\ImagineBundle\Imagine\Cache\CacheManager;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
    
    class ImageCacheSubscriber implements EventSubscriber
    {
    
        /**
         * CacheManager
         *
         * @var CacheManager
         */
        private $cacheManager;
    
        /**
         * UploaderHelper
         *
         * @var UploaderHelper
         */
        private $uploaderHelper;
    
        public function __construct(CacheManager $cacheManager, UploaderHelper $uploaderHelper)
        {
            $this->cacheManager = $cacheManager;
            $this->uploaderHelper = $uploaderHelper;
        }
    
        public function getSubscribedEvents()
        {
            return [
                'preRemove',
                'preUpdate'
            ];
        }
    
        public function preRemove(LifecycleEventArgs $args)
        {
    
            $entity = $args->getEntity();
            if (!$entity instanceof Avatar) {
                return;
            }
    
            $this->cacheManager->remove($this->uploaderHelper->asset($entity, 'imageFile'));
        }
    
        public function preUpdate(PreUpdateEventArgs $args)
        {
            dump($args->getEntity());
            dump($args->getObject());
    
            $entity = $args->getEntity();
            if (!$entity instanceof Avatar) {
                return;
            }
    
            if ($entity->getImageFile() instanceof UploadedFile) {
                $this->cacheManager->remove($this->uploaderHelper->asset($entity, 'imageFile'));
            }
        }
    }
    



    Le problème c'est que quand mon utilisateur modifie son avatar, ça supprime carrément tout le cache de LiipImagine !

    Et j'obtiens en surplus cette erreur :

    Failed to remove directory "C:\Users\user\Desktop\congesTest2/public/media/cache/avatar_big\files": rmdir(C:\Users\user\Desktop\congesTest2/public/media/cache/avatar_big\files): Directory not empty.

    Pourtant ça devrait bien fonctionner...

    J'ai fait quelques vérifications, et quand je dump mon $entity, j'ai bien l'entité Avatar, et la ligne de commande devrait donc fonctionner mais elle fonctionne "trop", c'est vraiment bizarre...




    -
    Edité par AgarioFR 17 septembre 2019 à 18:02:13

    • Partager sur Facebook
    • Partager sur Twitter
      17 avril 2020 à 23:42:33

      Vérifie si tu as l'extension GD de PHP installée.
      • Partager sur Facebook
      • Partager sur Twitter
        2 juillet 2020 à 16:06:00

        Bonjour à tous,

        j'ai le même problème, hormis l'erreur. Est-ce que tu as trouvé la solution ?

        Merci

        • Partager sur Facebook
        • Partager sur Twitter

        [Symfony 4] Listener pour vider cache LiipImagine

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown