<?php
namespace App\EventSubscriber;
use App\Event\Account\AccountEnrollmentEvent;
use App\Event\NotFullRegisteredUserEvent;
use App\Event\PasswordChangedEvent;
use App\Event\ReceivePasswordEvent;
use App\Event\RegisteredSuccessUserEvent;
use App\Security\LoginFormAuthenticator;
use App\Service\Mailer;
use App\Event\RegisteredUserEvent;
use App\Service\UserService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
class UserSubscriber implements EventSubscriberInterface
{
public function __construct(
private Mailer $mailer,
private UserService $userService,
private GuardAuthenticatorHandler $guardHandler,
private LoginFormAuthenticator $authenticator,
private RequestStack $requestStack
) {}
public static function getSubscribedEvents(): array
{
return [
RegisteredUserEvent::NAME => 'onUserRegister',
RegisteredSuccessUserEvent::NAME => 'onUserRegisterSuccess',
NotFullRegisteredUserEvent::NAME => 'onUserNotFullRegister',
ReceivePasswordEvent::NAME => 'onUserReceivePassword',
PasswordChangedEvent::NAME => 'onUserPasswordChanged',
AccountEnrollmentEvent::NAME => 'onAccountEnrollment',
];
}
public function onUserReceivePassword(ReceivePasswordEvent $receivePasswordEvent): void
{
$this->mailer->sendAccountPasswordResetMessage($receivePasswordEvent->getRegisteredUser());
}
public function onUserPasswordChanged(PasswordChangedEvent $passwordChangedEvent): void
{
$this->guardHandler->authenticateUserAndHandleSuccess($passwordChangedEvent->getRegisteredUser(), $this->requestStack->getCurrentRequest(), $this->authenticator, 'main');
}
public function onUserRegister(RegisteredUserEvent $registeredUserEvent): void
{
$this->mailer->sendRegisteredAccountActivationMessage($registeredUserEvent->getRegisteredUser());
}
public function onUserRegisterSuccess(RegisteredSuccessUserEvent $registeredUserEvent): void
{
$this->mailer->sendRegisteredAccountConfirmationMessage($registeredUserEvent->getRegisteredUser());
}
public function onUserNotFullRegister(NotFullRegisteredUserEvent $registeredUserEvent): void
{
$this->mailer->sendFakeLoginActivationMessage($registeredUserEvent->getRegisteredUser());
}
public function onAccountEnrollment(AccountEnrollmentEvent $accountEnrollmentEvent): void
{
$this->userService->checkAccountBalanceNormal($accountEnrollmentEvent->getEnrollment()->getAccount());
}
}