个性化阅读
专注于IT技术分析

如何在Symfony 4.3中实现自己的用户身份验证系统:第2部分(创建用户注册表单)

点击下载

本文概述

在上一篇文章中, 我们解释了使用你自己的字段从头开始创建自己的用户实体是多么容易。从结构上讲, 这是实现自己的用户系统最重要的部分, 现在我们需要实现一种简单的方法, 使用户可以简单地在网站上注册自己。在这一部分, 我们将向你解释如何使用在该系列的第一部分中创建的User实体轻松实现用户注册表单。

1.创建RegistrationFormType

第一步, 将使用Symfony Fomrs组件创建表单。在应用程序的/ app / src / Form /目录中创建具有以下内容的新表单类型, 即RegistrationFormType:

<?php

// app/src/Form/RegistrationFormType.php
namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\IsTrue;

class RegistrationFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstName')
            ->add('lastName')
            ->add('email')
            ->add('plainPassword', RepeatedType::class, [
                'type' => PasswordType::class, 'invalid_message' => 'The password fields must match.', 'required' => true, 'first_options'  => ['label' => 'Password'], 'second_options' => ['label' => 'Repeat Password'], // instead of being set onto the object directly, // this is read and encoded in the controller
                'mapped' => false, 'constraints' => [
                    new NotBlank([
                        'message' => 'Please enter a password', ]), new Length([
                        'min' => 6, 'minMessage' => 'Your password should be at least {{ limit }} characters', // max length allowed by Symfony for security reasons
                        'max' => 4096, ]), ], ])
            ->add('agreeTerms', CheckboxType::class, [
                'mapped' => false, 'constraints' => [
                    new IsTrue([
                        'message' => 'You should agree to our terms.', ]), ], ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class, ]);
    }
}

在该类的configureOptions方法中, 我们将把User类(在系列的第一部分中创建)绑定为表单的data_class。该表格将有5个字段, 其中4个字段要求用户提供注册新用户的基本信息, 名字和姓氏, 电子邮件和密码。

2.创建RegistrationController

几秒钟之后, 我们将必须安排一些通往用户的路由, 以便用户可以自己注册。我们将公开一个专门用于注册的控制器, 该控制器可在mywebsite.com/register上找到。在此控制器中, 我们将执行一个操作, 该操作将呈现注册视图, 并且还将通过条件(如果条件表已提交)来处理注册用户所需的信息。 register方法将通过依赖注入接收UserPasswordEncoderInterface, 该接口将用于编码通过以下形式发送的纯文本密码:

<?php

// app/src/Controller/RegistrationController.php
namespace App\Controller;

use App\Entity\User;
use App\Form\RegistrationFormType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class RegistrationController extends AbstractController
{
    /**
     * @Route("/register", name="app_register")
     */
    public function register(Request $request, UserPasswordEncoderInterface $passwordEncoder): Response
    {
        $user = new User();
        $form = $this->createForm(RegistrationFormType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // encode the plain password
            $user->setPassword(
                $passwordEncoder->encodePassword(
                    $user, $form->get('plainPassword')->getData()
                )
            );

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($user);
            $entityManager->flush();

            
            // do anything else you need here, like send an email
            // in this example, we are just redirecting to the homepage
            return $this->redirectToRoute('app_index');
        }

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

该动作将使用表单呈现Twig视图, 并且在提交表单时将发生上述逻辑。

3.在Twig中创建注册视图

最后, 我们只需要在控制器上创建作为响应发送的视图。在/ app / templates / registration /目录(即register.html.twig)中创建的该视图将具有以下内容:

{# /app/templates/registration/register.html.twig #}
{% extends 'base.html.twig' %}

{% block title %}Register{% endblock %}

{% block body %}
    <h1>Register</h1>

    {# If there are any errors on the form, display them #}
    {% set formErrors = registrationForm.vars.errors.form.getErrors(true) %}
    {% if formErrors|length %}
        <div class="alert alert-danger">
            <ul>
                {% for error in formErrors %}
                    <li>{{ error.message }}</li>
                {% endfor %}
            </ul>
        </div>
    {% endif %}

    {# Render the Form #}
    {{ form_start(registrationForm) }}
        {{ form_row(registrationForm.firstName) }}
        {{ form_row(registrationForm.lastName) }}
        {{ form_row(registrationForm.email) }}
        {{ form_row(registrationForm.plainPassword) }}
        {{ form_row(registrationForm.agreeTerms) }}

        <button class="btn">Register</button>
    {{ form_end(registrationForm) }}
{% endblock %}

最初, 我们将检查表单上是否存储了任何错误, 以便用户知道给定的信息是否足以注册自己。然后, 我们将使用form_start, form_row和form_end标记手动呈现表单。

4.测试表单

最后, 你可以在网站上测试注册路线并填写以下表格:

注册表Symfony 4.3

用户将能够轻松注册自己。

阅读教程的所有部分”如何在SYMFONY 4.3中实施你自己的用户认证系统”

  • 第1部分:创建自定义用户类。
  • 第2部分:创建用户注册表单。
  • 第3部分:创建登录表单和注销路径。

对本教程的兴趣链接

  • https://symfony.com/doc/4.0/doctrine/registration_form.html

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 4.3中实现自己的用户身份验证系统:第2部分(创建用户注册表单)

评论 抢沙发

评论前必须登录!