<?php
/**
* @author <akartis-dev>
*/
namespace App\EventSubscriber;
use App\Service\Constant\CookiesConstant;
use App\Service\Logs\LogsService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
class RequestSubscribe implements EventSubscriberInterface
{
public function __construct(
private array $locale,
private LogsService $logsService
)
{
}
public static function getSubscribedEvents()
{
return [
RequestEvent::class => 'onKernelRequest',
ResponseEvent::class => 'onKernelResponse'
];
}
/**
* Kernel request to force locale in url if request has no locale
* Assign default Navigator id with cookie to handle logs
*
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
$redirect = $this->checkLocale($request);
if ($redirect) {
$response = new RedirectResponse($redirect);
$event->setResponse($response);
}
}
public function onKernelResponse(ResponseEvent $event)
{
if ($event->isMainRequest()) {
$request = $event->getRequest();
$expireCookieTime = time() + (60 * 24 * 30); // 1months
$response = $event->getResponse();
$navId = $request->cookies->get(CookiesConstant::navId);
if (!$navId) {
$response->headers->setCookie(
Cookie::create(
name: CookiesConstant::navId,
value: $this->logsService->createCookiesId(),
expire: $expireCookieTime,
)
);
}
$event->setResponse($response);
}
}
/**
* Return url to redirect with local or null
*
* @param Request $request
* @return string|null
*/
private function checkLocale(Request $request): ?string
{
$locale = array_keys($this->locale);
$method = $request->getMethod();
if (Request::METHOD_GET === $method && !in_array($request->getLocale(), $locale, true)) {
$defaultLocal = "fr";
return sprintf("/%s%s", $defaultLocal, $request->getRequestUri());
}
return null;
}
}