<?php
/**
* Author: Anton Orlov
* Date: 23.03.2018
* Time: 13:45
*/
namespace FMT\Application\Listener;
use FMT\Data\Entity\User;
use FMT\Domain\Event\UserEvent;
use FMT\Application\FormType\Security\RegistrationDonorType;
use FMT\Application\FormType\Security\RegistrationStudentType;
use FMT\Application\FormType\Security\UserPasswordType;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
/**
* Class UserToFOSListener
* @package FMT\Application\Listener
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
class UserToFOSListener
{
/** @var EventDispatcherInterface */
private $dispatcher;
/** @var FormFactoryInterface */
private $factory;
/** @var RequestStack */
private $stack;
/**
* UserToFOSListener constructor.
* @param EventDispatcherInterface $dispatcher
* @param FormFactoryInterface $factory
* @param RequestStack $stack
*/
public function __construct(
EventDispatcherInterface $dispatcher,
FormFactoryInterface $factory,
RequestStack $stack
) {
$this->dispatcher = $dispatcher;
$this->factory = $factory;
$this->stack = $stack;
}
/**
* @param UserEvent $event
*/
public function onUserSubmitted(UserEvent $event)
{
$user = $event->getUser();
if (!$user->isAnyStudent() && !$user->isAnyDonor() && !$user->isInternal()) {
return;
}
$event = new GetResponseUserEvent($user, $this->stack->getCurrentRequest());
$this->dispatcher->dispatch($event, FOSUserEvents::REGISTRATION_INITIALIZE);
$event = new FormEvent($this->getUserForm($user), $this->stack->getCurrentRequest());
$this->dispatcher->dispatch($event, FOSUserEvents::REGISTRATION_SUCCESS);
}
/**
* @param UserEvent $event
*/
public function onUserCreated(UserEvent $event)
{
$user = $event->getUser();
if (!$user->isAnyStudent() && !$user->isAnyDonor() || !$user->isInternal()) {
return;
}
$event = new FilterUserResponseEvent($user, $this->stack->getCurrentRequest(), new Response());
$this->dispatcher->dispatch($event, FOSUserEvents::REGISTRATION_COMPLETED);
}
/**
* @param UserEvent $event
*/
public function onUserFailed(UserEvent $event)
{
$user = $event->getUser();
if (!$user->isAnyStudent() && !$user->isAnyDonor() && !$user->isInternal()) {
return;
}
$event = new FormEvent($this->getUserForm($user), $this->stack->getCurrentRequest());
$this->dispatcher->dispatch($event, FOSUserEvents::REGISTRATION_FAILURE);
}
/**
* @param UserEvent $event
*/
public function onResetSuccess(UserEvent $event)
{
$user = $event->getUser();
if (!$user->isAnyStudent() && !$user->isAnyDonor() && !$user->isInternal()) {
return;
}
$form = $this->factory->create(UserPasswordType::class, $user);
$formEvent = new FormEvent($form, $this->stack->getCurrentRequest());
$this->dispatcher->dispatch($formEvent, FOSUserEvents::RESETTING_RESET_SUCCESS);
}
/**
* @param UserEvent $event
*/
public function onConfirmationSuccess(UserEvent $event)
{
$user = $event->getUser();
if (!$user->isAnyStudent() && !$user->isAnyDonor() && !$user->isInternal()) {
return;
}
$fosEvent = new GetResponseUserEvent($user, $this->stack->getCurrentRequest());
$this->dispatcher->dispatch($fosEvent, FOSUserEvents::REGISTRATION_CONFIRM);
}
/**
* @param User $user
* @return \Symfony\Component\Form\FormInterface
*/
private function getUserForm(User $user)
{
$class = $user->isAnyStudent() ? RegistrationStudentType::class : RegistrationDonorType::class;
return $this->factory->create($class, $user);
}
}