src/EventSubscriber/CustomerArchiveFilterSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Doctrine\Filter\CustomerArchiveFilter;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. /**
  9.  * `customer_archive` filtresini her request'in basinda acar.
  10.  *
  11.  * Filtre `doctrine.yaml`'da `enabled: false` ile kayitli — Doctrine kayitli
  12.  * filtreleri kendiliginden acmaz. Acmayi tek bir yerden yapmak, "bazi
  13.  * endpoint'lerde acik bazilarinda kapali" durumunu bastan engeller.
  14.  *
  15.  * Kapatmak isteyen (musteri modulu gibi) acikca kapatir:
  16.  *   $em->getFilters()->disable(CustomerArchiveFilter::NAME);
  17.  *
  18.  * 🪤 Yalniz ANA request'te calisir; sub-request'te filtre zaten aciktir ve
  19.  *    tekrar acmak gereksiz is olur.
  20.  */
  21. class CustomerArchiveFilterSubscriber implements EventSubscriberInterface
  22. {
  23.     private EntityManagerInterface $manager;
  24.     public function __construct(EntityManagerInterface $manager)
  25.     {
  26.         $this->manager $manager;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         // Guvenlik/route cozuldukten sonra ama controller'dan once acilsin.
  31.         return [KernelEvents::REQUEST => ['onKernelRequest'8]];
  32.     }
  33.     /**
  34.      * Musteri modulunun KENDI route'lari — burada filtre KAPALI olmalidir.
  35.      *
  36.      * Aksi halde arsivlenen musteri kendi ekraninda da kaybolur; kullanici onu
  37.      * bir daha bulamaz, "geri al" tusu da gorunmez. Arsivleme geri alinabilir
  38.      * bir islem oldugu icin yonetim ekrani arsivlileri GORMEK zorundadir.
  39.      */
  40.     private const UNFILTERED_ROUTE_PREFIX 'api_v3_customer_';
  41.     public function onKernelRequest(RequestEvent $event): void
  42.     {
  43.         if (!$event->isMainRequest()) {
  44.             return;
  45.         }
  46.         $filters $this->manager->getFilters();
  47.         $route   = (string) $event->getRequest()->attributes->get('_route');
  48.         // RouterListener kernel.request'te 32 onceliginde calisir; bu subscriber
  49.         // 8'de oldugu icin `_route` burada dolu olur.
  50.         $isCustomerModule strpos($routeself::UNFILTERED_ROUTE_PREFIX) === 0;
  51.         if ($isCustomerModule) {
  52.             if ($filters->isEnabled(CustomerArchiveFilter::NAME)) {
  53.                 $filters->disable(CustomerArchiveFilter::NAME);
  54.             }
  55.             return;
  56.         }
  57.         if (!$filters->isEnabled(CustomerArchiveFilter::NAME)) {
  58.             $filters->enable(CustomerArchiveFilter::NAME);
  59.         }
  60.     }
  61. }