<?php
namespace App\EventSubscriber;
use App\Doctrine\Filter\CustomerArchiveFilter;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* `customer_archive` filtresini her request'in basinda acar.
*
* Filtre `doctrine.yaml`'da `enabled: false` ile kayitli — Doctrine kayitli
* filtreleri kendiliginden acmaz. Acmayi tek bir yerden yapmak, "bazi
* endpoint'lerde acik bazilarinda kapali" durumunu bastan engeller.
*
* Kapatmak isteyen (musteri modulu gibi) acikca kapatir:
* $em->getFilters()->disable(CustomerArchiveFilter::NAME);
*
* 🪤 Yalniz ANA request'te calisir; sub-request'te filtre zaten aciktir ve
* tekrar acmak gereksiz is olur.
*/
class CustomerArchiveFilterSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $manager;
public function __construct(EntityManagerInterface $manager)
{
$this->manager = $manager;
}
public static function getSubscribedEvents(): array
{
// Guvenlik/route cozuldukten sonra ama controller'dan once acilsin.
return [KernelEvents::REQUEST => ['onKernelRequest', 8]];
}
/**
* Musteri modulunun KENDI route'lari — burada filtre KAPALI olmalidir.
*
* Aksi halde arsivlenen musteri kendi ekraninda da kaybolur; kullanici onu
* bir daha bulamaz, "geri al" tusu da gorunmez. Arsivleme geri alinabilir
* bir islem oldugu icin yonetim ekrani arsivlileri GORMEK zorundadir.
*/
private const UNFILTERED_ROUTE_PREFIX = 'api_v3_customer_';
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$filters = $this->manager->getFilters();
$route = (string) $event->getRequest()->attributes->get('_route');
// RouterListener kernel.request'te 32 onceliginde calisir; bu subscriber
// 8'de oldugu icin `_route` burada dolu olur.
$isCustomerModule = strpos($route, self::UNFILTERED_ROUTE_PREFIX) === 0;
if ($isCustomerModule) {
if ($filters->isEnabled(CustomerArchiveFilter::NAME)) {
$filters->disable(CustomerArchiveFilter::NAME);
}
return;
}
if (!$filters->isEnabled(CustomerArchiveFilter::NAME)) {
$filters->enable(CustomerArchiveFilter::NAME);
}
}
}