src/EventSubscriber/RequireCustomerPseudoSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. final class RequireCustomerPseudoSubscriber implements EventSubscriberInterface
  11. {
  12. private const ALLOWED_ROUTES = [
  13. 'sylius_shop_account_profile_update',
  14. 'sylius_shop_login',
  15. 'sylius_shop_logout',
  16. 'sylius_shop_register',
  17. 'sylius_shop_request_password_reset_token',
  18. 'sylius_shop_password_reset',
  19. 'sylius_shop_password_reset_update',
  20. 'sylius_shop_user_verification',
  21. 'jsconnect',
  22. 'jsconnectv2',
  23. 'jsconnect_public',
  24. 'jsconnectv2_public',
  25. '_wdt',
  26. '_profiler',
  27. ];
  28. public function __construct(
  29. private readonly TokenStorageInterface $tokenStorage,
  30. private readonly UrlGeneratorInterface $urlGenerator,
  31. ) {
  32. }
  33. public static function getSubscribedEvents(): array
  34. {
  35. return [
  36. KernelEvents::REQUEST => ['onKernelRequest', 8],
  37. ];
  38. }
  39. public function onKernelRequest(RequestEvent $event): void
  40. {
  41. if (!$event->isMainRequest()) {
  42. return;
  43. }
  44. $request = $event->getRequest();
  45. if (!$request->isMethodSafe() || $request->isXmlHttpRequest()) {
  46. return;
  47. }
  48. $route = (string) $request->attributes->get('_route', '');
  49. if ('' === $route || in_array($route, self::ALLOWED_ROUTES, true) || str_starts_with($route, 'sylius_admin_')) {
  50. return;
  51. }
  52. $token = $this->tokenStorage->getToken();
  53. if (null === $token || !is_object($token->getUser())) {
  54. return;
  55. }
  56. $user = $token->getUser();
  57. if (method_exists($user, 'isVerified') && !$user->isVerified()) {
  58. return;
  59. }
  60. if (!method_exists($user, 'getCustomer')) {
  61. return;
  62. }
  63. $customer = $user->getCustomer();
  64. if (null === $customer || !method_exists($customer, 'getPseudo')) {
  65. return;
  66. }
  67. if ('' !== trim((string) $customer->getPseudo())) {
  68. return;
  69. }
  70. if ($request->hasSession()) {
  71. $request->getSession()->getFlashBag()->add('error', 'customer.pseudo.required');
  72. }
  73. $event->setResponse(new RedirectResponse($this->urlGenerator->generate('sylius_shop_account_profile_update', [
  74. '_locale' => $request->attributes->get('_locale', 'fr'),
  75. ])));
  76. }
  77. }