src/EventSubscriber/PartnerResolverSubscriber.php line 30

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Provider\PartnerProvider;
  5. use Doctrine\ORM\NonUniqueResultException;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. readonly class PartnerResolverSubscriber implements EventSubscriberInterface
  10. {
  11. public function __construct(
  12. private PartnerProvider $partnerProvider,
  13. ) {}
  14. public static function getSubscribedEvents(): array
  15. {
  16. // Priorité haute pour que le partenaire soit disponible tôt
  17. return [
  18. KernelEvents::REQUEST => ['onKernelRequest', 20],
  19. ];
  20. }
  21. /**
  22. * @throws NonUniqueResultException
  23. */
  24. public function onKernelRequest(RequestEvent $event): void
  25. {
  26. $request = $event->getRequest();
  27. // Éviter de traiter les requêtes internes ou sub-requests si nécessaire
  28. if (!$event->isMainRequest()) {
  29. return;
  30. }
  31. $host = $request->getHost();
  32. $parts = explode('.', $host);
  33. $subdomainParts = array_slice($parts, 0, -2);
  34. $subdomain = !empty($subdomainParts) ? implode('.', $subdomainParts) : null;
  35. $request->attributes->set('subdomain', $subdomain);
  36. $partner = null;
  37. if ($subdomain !== null) {
  38. $partner = $this->partnerProvider->getPartnerBySubdomain($subdomain);
  39. }
  40. // Injection du partenaire (null ou objet) pour toute la pile
  41. $request->attributes->set('partner', $partner);
  42. }
  43. }