<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Provider\PartnerProvider;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
readonly class PartnerResolverSubscriber implements EventSubscriberInterface
{
public function __construct(
private PartnerProvider $partnerProvider,
) {}
public static function getSubscribedEvents(): array
{
// Priorité haute pour que le partenaire soit disponible tôt
return [
KernelEvents::REQUEST => ['onKernelRequest', 20],
];
}
/**
* @throws NonUniqueResultException
*/
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
// Éviter de traiter les requêtes internes ou sub-requests si nécessaire
if (!$event->isMainRequest()) {
return;
}
$host = $request->getHost();
$parts = explode('.', $host);
$subdomainParts = array_slice($parts, 0, -2);
$subdomain = !empty($subdomainParts) ? implode('.', $subdomainParts) : null;
$request->attributes->set('subdomain', $subdomain);
$partner = null;
if ($subdomain !== null) {
$partner = $this->partnerProvider->getPartnerBySubdomain($subdomain);
}
// Injection du partenaire (null ou objet) pour toute la pile
$request->attributes->set('partner', $partner);
}
}