<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
final class RequireCustomerPseudoSubscriber implements EventSubscriberInterface
{
private const ALLOWED_ROUTES = [
'sylius_shop_account_profile_update',
'sylius_shop_login',
'sylius_shop_logout',
'sylius_shop_register',
'sylius_shop_request_password_reset_token',
'sylius_shop_password_reset',
'sylius_shop_password_reset_update',
'sylius_shop_user_verification',
'jsconnect',
'jsconnectv2',
'jsconnect_public',
'jsconnectv2_public',
'_wdt',
'_profiler',
];
public function __construct(
private readonly TokenStorageInterface $tokenStorage,
private readonly UrlGeneratorInterface $urlGenerator,
) {
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 8],
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
if (!$request->isMethodSafe() || $request->isXmlHttpRequest()) {
return;
}
$route = (string) $request->attributes->get('_route', '');
if ('' === $route || in_array($route, self::ALLOWED_ROUTES, true) || str_starts_with($route, 'sylius_admin_')) {
return;
}
$token = $this->tokenStorage->getToken();
if (null === $token || !is_object($token->getUser())) {
return;
}
$user = $token->getUser();
if (method_exists($user, 'isVerified') && !$user->isVerified()) {
return;
}
if (!method_exists($user, 'getCustomer')) {
return;
}
$customer = $user->getCustomer();
if (null === $customer || !method_exists($customer, 'getPseudo')) {
return;
}
if ('' !== trim((string) $customer->getPseudo())) {
return;
}
if ($request->hasSession()) {
$request->getSession()->getFlashBag()->add('error', 'customer.pseudo.required');
}
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('sylius_shop_account_profile_update', [
'_locale' => $request->attributes->get('_locale', 'fr'),
])));
}
}