Ошибки проверки формы регистрации пользователя Symfony

Я разработал базовую форму регистрации пользователя в соответствии с Symfony документация. Я получаю сообщения об ошибках проверки при попытке отправить форму о том, что пароль и число неудачных попыток входа не могут быть нулевыми:

data.password       This value should not be null
data.failedLogins   This value should not be null

Класс RegistrationFormType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('firstname', TextType::class, ['label'=> false, 'attr' => ['placeholder' => 'First name']])
        ->add('lastname', TextType::class, ['label'=> false, 'attr' => ['placeholder' => 'Last name']])
        ->add('email', EmailType::class, ['label'=> 'Email address', 'attr' => ['placeholder' => 'Email address']])
        ->add('plainPassword', PasswordType::class, [
            'label' => 'Password',
            'attr' => ['placeholder' => 'Must be at least 6 characters'],
            '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,
                ]),
            ],
        ])
    ;
}

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

Объект пользователя:

/**
* @var string The hashed password
* @ORM\Column(name = "password", type = "string", length=255, nullable=false, options = {"fixed"=true})
*/
private $password;

/**
 * @var int
 *
 * @ORM\Column(name = "failed_logins", type = "integer", nullable=false)
 */
private $failedLogins;

Контроллер:

public function register(Request $request, 
                         UserPasswordEncoderInterface $passwordEncoder, 
                         GuardAuthenticatorHandler $guardHandler, 
                         LoginFormAuthenticator $authenticator): Response
{
    $user = new User();
    $form = $this->createForm(RegistrationFormType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $user->setPassword($passwordEncoder->encodePassword($user, $form->get('plainPassword')->getData()));
        $user->setfailedLogins(0);

Похоже, проблема в том, что валидатор формы возвращает false, потому что он ожидает поля «пароль» и «failedLogins». Как показано в примере кода, я хотел бы не включать эти поля в форму и обращаться к ним после отправки формы...

Если я добавлю фиктивные скрытые поля в конструктор форм, то форма обрабатывается нормально:

->add('password', HiddenType::class, ['data' => 'abc'])
->add('failedLogins', HiddenType::class, ['data' => 0])

Однако это не похоже на правильный подход. Будем очень признательны за любое понимание того, почему эти поля проверяются, если они не включены в конструктор форм.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
349
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что у вас есть 2 разные проблемы, обе из них, потому что проверка выполняется в отношении объекта, связанного с формой.

Из документов Проверка формы:

Symfony, validation is applied to the underlying object (e.g. Task). In other words, the question isn't whether the "form" is valid, but whether or not the $task object is valid after the form has applied the submitted data to it. Calling $form->isValid() is a shortcut that asks the $task object whether or not it has valid data.


  1. Ваш пароль называется password в сущности User, но plainPassword в форме. Функция проверки не найдет свойство plainPassword в сущности и вернет data.password This data should not be null. Итак, вы можете просто изменить имя поля формы на password

  2. У вас есть failedLogins в вашей сущности, но его нет в форме. Проверка формы по умолчанию проверяет все свойства объекта. Поскольку failedLogins объявлен как nullable=false, проверка вернет data.failedLogins This data should not be null. В этом случае вам понадобится Группы проверки, который позволит вам выбрать, какие свойства User будут учитываться при проверке формы.

Другие вопросы по теме