src/Tuer24/EventSubscriber/DisableUserAwareFilterSubscriber.php line 49

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Tuer24\EventSubscriber;
  4. use App\Tuer24\ApiResource\Tuer24Article;
  5. use App\Tuer24\ApiResource\Tuer24DistributorRequest;
  6. use App\Tuer24\Controller\Tuer24DistributorOrderController;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. /**
  13. * Disables the UserAware SQL filter for specific controllers.
  14. *
  15. * This subscriber runs before EasyAdmin's AdminRouterSubscriber (priority -1)
  16. * to ensure the filter is disabled before entity fetching occurs.
  17. *
  18. * Required for distributors to view orders from other users.
  19. */
  20. class DisableUserAwareFilterSubscriber implements EventSubscriberInterface
  21. {
  22. private EntityManagerInterface $em;
  23. /**
  24. * Controllers that should bypass the UserAware filter
  25. */
  26. private const BYPASS_CONTROLLERS = [
  27. Tuer24DistributorOrderController::class,
  28. ];
  29. public function __construct(EntityManagerInterface $em)
  30. {
  31. $this->em = $em;
  32. }
  33. public static function getSubscribedEvents(): array
  34. {
  35. return [
  36. // Run AFTER UserDetection (priority 5/PRE_READ) but BEFORE EasyAdmin's AdminRouterSubscriber (priority -1)
  37. // UserDetection enables the filter, we need to disable it after that
  38. KernelEvents::REQUEST => ['onKernelRequest', 1],
  39. ];
  40. }
  41. public function onKernelRequest(RequestEvent $event): void
  42. {
  43. if (!$event->isMainRequest()) {
  44. return;
  45. }
  46. $request = $event->getRequest();
  47. // Check if this is an EasyAdmin request with a controller we want to bypass
  48. if ($this->isDisabled($request)) {
  49. $filters = $this->em->getFilters();
  50. if ($filters->isEnabled('user_aware_filter')) {
  51. $filters->disable('user_aware_filter');
  52. }
  53. }
  54. }
  55. private function isDisabled(Request $request): bool
  56. {
  57. $disable = false;
  58. if($request->query->has('crudControllerFqcn')){
  59. $disable = in_array($request->query->get('crudControllerFqcn'), self::BYPASS_CONTROLLERS, true);
  60. }
  61. if($request->attributes->has('_api_resource_class') && !$disable) {
  62. $disable = in_array($request->attributes->get('_api_resource_class'), [Tuer24Article::class, Tuer24DistributorRequest::class], true);
  63. }
  64. return $disable;
  65. }
  66. }