<?php
namespace App\Controller;
use App\Entity\User;
use App\Service\MailerService;
use App\Service\UserManager;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class RegistrationController extends BaseController
{
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var FactoryInterface
*/
private $formFactory;
/**
* @var UserManagerInterface
*/
private $fosUserManager;
/**
* @var TokenGeneratorInterface
*/
private $tokenGenerator;
/**
* @var MailerService
*/
private $mailerService;
/**
* @var UserManager
*/
private $userManager;
/**
* RegistrationController constructor.
* @param EventDispatcherInterface $eventDispatcher
* @param FactoryInterface $formFactory
* @param UserManagerInterface $fosUserManager
* @param TokenStorageInterface $tokenStorage
* @param TokenGeneratorInterface $tokenGenerator
* @param MailerService $mailerService
* @param UserManager $userManager
*/
public function __construct(
EventDispatcherInterface $eventDispatcher,
FactoryInterface $formFactory,
UserManagerInterface $fosUserManager,
TokenStorageInterface $tokenStorage,
TokenGeneratorInterface $tokenGenerator,
MailerService $mailerService,
UserManager $userManager
)
{
parent::__construct($eventDispatcher, $formFactory, $fosUserManager, $tokenStorage);
$this->eventDispatcher = $eventDispatcher;
$this->formFactory = $formFactory;
$this->fosUserManager = $fosUserManager;
$this->tokenGenerator = $tokenGenerator;
$this->mailerService = $mailerService;
$this->userManager = $userManager;
}
/**
* @param Request $request
*
* @return Response
*
* @throws \Throwable
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
* @Security("has_role('ROLE_USER')")
*/
public function registerAction(Request $request)
{
$this->denyAccessUnlessGranted('ICO_EDIT_USER', $this->getUser());
$formFactory = $this->formFactory;
$fosUserManager = $this->fosUserManager;
$dispatcher = $this->eventDispatcher;
/* @var $user User */
$user = $fosUserManager->createUser();
$user->setEnabled(true);
$event = new GetResponseUserEvent($user, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
if (null !== $event->getResponse()) {
return $event->getResponse();
}
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);
if ($form->get('passwordSendMail')->getData()) {
$this->userManager->sendMailToInitPassword($user);
} else {
$fosUserManager->updateUser($user);
}
if (null === $response = $event->getResponse()) {
$url = $this->generateUrl('sunshine_page', ['pageId' => 'userGrid']);
$response = new RedirectResponse($url);
}
$this->get('session')->getFlashBag()->add('success', 'Enregistrement effectué avec succès');
return $response;
}
$event = new FormEvent($form, $request);
$dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);
if (null !== $response = $event->getResponse()) {
return $response;
}
}
return $this->render(
'@FOSUser/Registration/register.html.twig',
array(
'form' => $form->createView(),
)
);
}
}