<?php
namespace App\EventSubscriber;
use Exception;
use App\Entity\BlogPost;
use App\Entity\BlogPostCategory;
use App\Entity\BlogPostTranslation;
use App\Entity\User;
use App\Service\SlugGenerator;
use App\Repository\BlogPostRepository;
use App\Repository\MediaRepository;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityDeletedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\String\Slugger\SluggerInterface;
class EasyAdminSubscriber implements EventSubscriberInterface
{
public function __construct(
private SluggerInterface $slugger,
private SlugGenerator $slugGenerator,
private RequestStack $requestStack,
private EntityManagerInterface $em,
private MediaRepository $mediaRepository,
private BlogPostRepository $blogPostRepository
) {
}
public static function getSubscribedEvents()
{
return [
AfterEntityPersistedEvent::class => ['afterEntityPersisted'],
AfterEntityUpdatedEvent::class => ['afterEntityUpdated'],
AfterEntityDeletedEvent::class => ['afterEntityDeleted'],
];
}
public function afterEntityPersisted(AfterEntityPersistedEvent $event)
{
$this->requestStack
->getSession()
->getFlashBag()
->add('success', "Création de l'entité effectuée avec succès");
}
public function afterEntityUpdated(AfterEntityUpdatedEvent $event)
{
$this->requestStack
->getSession()
->getFlashBag()
->add('success', "Vos modifications ont été enregistrées");
}
public function afterEntityDeleted(AfterEntityDeletedEvent $event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof BlogPost) {
$regexUrl = '/href="\/uploads\/medias\/([^"]+)"/';
preg_match_all($regexUrl, $entity->getDescription(), $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $fileName) {
$media = $this->mediaRepository->findOneBy(['fileName' => $fileName]);
if ($media) {
// Need exeption catching in case the media is used somewhere else the application
// and should not be deleted
try {
$this->em->remove($media);
$this->em->flush();
} catch (Exception $e) {
}
}
}
}
}
$this->requestStack
->getSession()
->getFlashBag()
->add('success', "L'entité a bien été supprimée");
}
}