src/Controller/Abstract/AuthenticationController.php line 183
<?phpnamespace App\Controller\Abstract;use App\Service\AssociationHandlerService;use App\Service\TaggedTypesService;use App\Traits\Form\DiscriminatorFormGenerator;use Doctrine\ORM\EntityManagerInterface;use Exception;use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\MailerInterface;use Symfony\Component\Mime\Email;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;use Symfony\Component\Validator\Validator\ValidatorInterface;use Symfony\Contracts\Cache\CacheInterface;use Twig\Environment;/*** Abstract authentication controller.**/class AuthenticationController extends CommonController{use DiscriminatorFormGenerator;const PATH_PREFIX = 'authentication';/*** Abstract authenticate Method** @param AuthenticationUtils $authenticationUtils* @param Environment $twig* @param TaggedTypesService $taggedTypesService* @return RedirectResponse|Response**/public function authenticate(AuthenticationUtils $authenticationUtils, Environment $twig, TaggedTypesService $taggedTypesService): RedirectResponse|Response{// get entity class$entityClass = static::class::ENTITY_CLASS;// get template name$method = __FUNCTION__;// get controller prefix$controller = static::class::PATH_PREFIX;// get the login error if there is one$error = $authenticationUtils->getLastAuthenticationError();// last username entered by the user$lastUsername = $authenticationUtils->getLastUsername();$templatePath = $controller . '/' . __FUNCTION__ . '.html.twig';$entityName = $taggedTypesService->getShortEntityName($entityClass);if ($twig->getLoader()->exists($controller . '/' . $entityName . '/' . $method . '.html.twig')) {$templatePath = $controller . '/' . $entityName . '/' . $method . '.html.twig';} else {if ($twig->getLoader()->exists($controller . '/' . $method . '.html.twig')) {$templatePath = $controller . '/' . $method . '.html.twig';}}return $this->render($templatePath, array('path_prefix' => self::PATH_PREFIX,'last_username' => $lastUsername,'error' => $error,'entity_name' => $entityName,'path_entity_name' => $entityClass::ENTITY_PATH_IDENTIFIER,));}/*** Abstract Verify Method** @param Request $request* @param EntityManagerInterface $entityManager** @return RedirectResponse|Response*/public function verify(Request $request, EntityManagerInterface $entityManager): RedirectResponse|Response{// get entity class$entityClass = static::class::ENTITY_CLASS;// get user$user = $entityManager->getRepository($entityClass)->findOneBy(['verificationToken' => $request->get('token')]);$user->setVerified(true);$user->setVerificationToken(null);$entityManager->flush();$this->addFlash('success','User successfully verified');return $this->redirect('/');}/*** Abstract Reset Method** @param Request $request* @param ValidatorInterface $validator* @param EntityManagerInterface $entityManager* @param UrlGeneratorInterface $router* @param AssociationHandlerService $associationHandlerService* @param TaggedTypesService $taggedTypesService* @param Environment $twig* @param UserPasswordHasherInterface $passwordHasher* @return RedirectResponse|Response** @throws Exception*/public function reset(Request $request, ValidatorInterface $validator, EntityManagerInterface $entityManager, UrlGeneratorInterface $router, AssociationHandlerService $associationHandlerService, TaggedTypesService $taggedTypesService, Environment $twig, UserPasswordHasherInterface $passwordHasher): RedirectResponse|Response{// get entity class$entityClass = static::class::ENTITY_CLASS;// get user$user = $entityManager->getRepository($entityClass)->findOneBy(['resetToken' => $request->get('token')]);// get entities$entities = [$user];// get controller prefix$controller = static::class::PATH_PREFIX;// get template name$method = __FUNCTION__;// generate form class pairs$formTypeClassPairs = $taggedTypesService->getDescendantEntityFormPairs($entityClass, $controller, $method);// post submit function$postSubmitFunction = function ($entities, $form) use ($passwordHasher) {foreach ($entities as $entity) {$entity->setResetToken(null);$hashedPassword = $passwordHasher->hashPassword($entity,$entity->getPassword());$entity->setPassword($hashedPassword);}};// on success function$successFunction = function () {$this->addFlash('success','Password updated successfully');return $this->redirect('/');};return $this->generic($request, $validator, $entityManager, $associationHandlerService, $taggedTypesService, $router, $twig, $entityClass, $method, $formTypeClassPairs, $controller, $entities, null, $postSubmitFunction, $successFunction, false);}/*** Abstract Register Method** @param Request $request* @param ValidatorInterface $validator* @param EntityManagerInterface $entityManager* @param UrlGeneratorInterface $router* @param AssociationHandlerService $associationHandlerService* @param TaggedTypesService $taggedTypesService* @param Environment $twig* @return Response | RedirectResponse** @throws Exception*/public function register(Request $request, ValidatorInterface $validator, EntityManagerInterface $entityManager, UrlGeneratorInterface $router, AssociationHandlerService $associationHandlerService, TaggedTypesService $taggedTypesService, Environment $twig): Response | RedirectResponse{// get entity class$entityClass = static::class::ENTITY_CLASS;// get entities$entities = [];// get template name$method = __FUNCTION__;// get controller prefix$controller = static::class::PATH_PREFIX;// generate form class pairs$formTypeClassPairs = $taggedTypesService->getDescendantEntityFormPairs($entityClass, $controller, $method);// post submit function$postSubmitFunction = function ($entities, $form) use ($entityManager) {foreach ($entities as $entity) {$entityManager->persist($entity);}};// on success function$successFunction = function () {$this->addFlash('success','Thank you for registering, please check your email inbox for confirmation');return $this->redirect('/');};return $this->generic($request, $validator, $entityManager, $associationHandlerService, $taggedTypesService, $router, $twig, $entityClass, $method, $formTypeClassPairs, $controller, $entities, null, $postSubmitFunction, $successFunction);}/*** Abstract Reset Request Method** @param Request $request* @param ValidatorInterface $validator* @param EntityManagerInterface $entityManager* @param AssociationHandlerService $associationHandlerService* @param TaggedTypesService $taggedTypesService* @param Environment $twig* @param MailerInterface $mailer* @param ParameterBagInterface $params* @param UrlGeneratorInterface $router* @return Response | RedirectResponse** @throws Exception*/public function request(Request $request, ValidatorInterface $validator, EntityManagerInterface $entityManager, AssociationHandlerService $associationHandlerService, TaggedTypesService $taggedTypesService, Environment $twig, MailerInterface $mailer, ParameterBagInterface $params, UrlGeneratorInterface $router): Response | RedirectResponse{// get entity class$entityClass = static::class::ENTITY_CLASS;// get entities$entities = [];// get template name$method = __FUNCTION__;// get controller prefix$controller = static::class::PATH_PREFIX;// generate form class pairs$formTypeClassPairs = $taggedTypesService->getDescendantEntityFormPairs($entityClass, $controller, $method);// post submit function$postSubmitFunction = function ($entities, $form) use ($entityManager, $params, $mailer, $router, $entityClass, $taggedTypesService) {$entityName = $taggedTypesService->getShortEntityName($entityClass);$pathEntityName = strtolower(trim(preg_replace('/(?<!\ )[A-Z]/', '_$0', $entityName), '_'));$entityArray = array_filter(array_merge([], ...array_values($form->getData())));foreach ($entityArray as $arrayEntity) {$entity = $entityManager->getRepository(get_class($arrayEntity))->findOneBy(['email' => $arrayEntity->getEmail()]);if ($entity) {$token = bin2hex(random_bytes(64));$token = substr($token, 0, 64);$entity->setResetToken($token);$email = (new Email())->from($params->get('site_from_email'))->to($entity->getEmail())->subject('Password reset request')->text('Please visit ' . $router->generate('authentication_' . $pathEntityName . '_reset', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL) . ' to reset your password')->html('<p>Please visit <a href="' . $router->generate('authentication_' . $pathEntityName . '_reset', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL) . '">' . $params->get('site_short_title') . '</a> to reset your password</p>');$mailer->send($email);}}};// on success function$successFunction = function () {$this->addFlash('success','If a user with that address exists, a password reset link will be emailed to them');return $this->redirect('/');};return $this->generic($request, $validator, $entityManager, $associationHandlerService, $taggedTypesService, $router, $twig, $entityClass, $method, $formTypeClassPairs, $controller, $entities, null, $postSubmitFunction, $successFunction, false);}}