thomas-claireau/PHP-P6-Openclassrooms

View on GitHub
src/Controller/Security/SecurityController.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace App\Controller\Security;

use App\Entity\User;
use Twig\Environment;
use App\Form\UserType;
use App\Repository\UserRepository;
use App\Form\ForgotPasswordUserType;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class SecurityController extends AbstractController
{

    /**
     * @var UserRepository
     */
    private $repository;

    /**
     * @var ObjectManager
     */
    private $em;

    /**
     * @var UserPasswordEncoderInterface
     */
    private $encoder;

    /**
     * Undocumented variable
     *
     * @var \Swift_Mailer
     */
    private $mail;

    /**
     * Undocumented variable
     *
     * @var Environment
     */
    private $renderer;


    public function __construct(UserRepository $repository, ObjectManager $em, UserPasswordEncoderInterface $encoder, \Swift_Mailer $mailer, Environment $renderer)
    {
        $this->repository = $repository;
        $this->em = $em;
        $this->encoder = $encoder;
        $this->mailer = $mailer;
        $this->renderer = $renderer;
    }

    /**
     * @Route("/login", name="login")
     */
    public function login(AuthenticationUtils $authenticationUtils)
    {
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();


        return $this->render('security/login.html.twig', [
            'error' => $error,
            'current_menu' => 'login'
        ]);
    }

    /**
     * @Route("/register", name="register")
     */
    public function register(Request $request)
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $token = bin2hex(random_bytes(32));

            $user->setPassword($this->encoder->encodePassword($user, $user->getPassword()));
            $user->setActif(0);
            $user->setToken($token);

            $this->em->persist($user);
            $this->em->flush();
            $this->addFlash('success', 'Votre inscription a été acceptée. Vous avez reçu un mail de confirmation à l\'adresse que vous nous avez indiqué.');

            // envoi mail
            $message = (new \Swift_Message('Bienvenue ' . $user->getUsername() . ' ! Veuillez confirmer votre adresse mail.'))
                ->setFrom('no-reply@snow-tricks.com')
                ->setTo($user->getEmail())
                ->setBody($this->renderer->render('emails/confirmation.html.twig', [
                    'user' => $user,
                ]), 'text/html');

            $this->mailer->send($message);

            return $this->redirectToRoute('home');
        }

        return $this->render('security/register.html.twig', [
            'current_menu' => 'register',
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/forgot-password", name="forgot.password")
     */
    public function forgotPassword(Request $request)
    {
        $user = new User();
        $form = $this->createForm(ForgotPasswordUserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $token = bin2hex(random_bytes(32));
            $email = $user->getEmail();

            $userExist = $this->getDoctrine()
                ->getRepository(User::class)
                ->findBy(array('email' => $email));

            $userExist = isset($userExist[0]) ? $userExist[0] : false;

            if ($userExist) {
                $userExist->setToken($token);
                $this->em->persist($userExist);
                $this->em->flush();

                // envoi mail
                $message = (new \Swift_Message('Réinitialisation de votre mot de passe'))
                    ->setFrom('no-reply@snow-tricks.com')
                    ->setTo($userExist->getEmail())
                    ->setBody($this->renderer->render('emails/reset-password.html.twig', [
                        'user' => $userExist,
                    ]), 'text/html');

                $this->mailer->send($message);
            }

            $this->addFlash('success', 'Si votre email est bien associé à un compte, vous avez reçu un mail vous invitant à réinitialiser votre mot de passe');
            return $this->redirectToRoute('home');
        }

        return $this->render('security/forgot-password.html.twig', [
            'current_menu' => 'register',
            'form' => $form->createView(),
        ]);
    }
}