Условное ограничение Symfony для функции "Сброс пароля"

Я внедрил страницу сброса пароля в свой проект. Он работает, но я стараюсь использовать лучшие практики и многоразовый код. Так вот проблема. У меня есть FormType для формы сброса пароля и контроллера сброса. Я знаю, что проверка обычно означает сопоставление полей типа формы с объектом класса и наличие правил проверки свойств этого объекта. Но для сброса пароля я думаю, что использование полей "не сопоставлено" не требуется. На данный момент я передаю форму и получаю значения в ResettingController. Там я проверяю сам, если существует пользователь с электронной почтой, днем рождения и безопасностью. Это работает, но я думаю, что не реализовано правильно. Можно ли добавить настраиваемое ограничение на весь ResetFormType, и при отправке формы он должен вызвать ограничение, которое проверяет, существует ли пользователь. Поэтому я хочу использовать систему проверки Symfony, а не "if, else, if...", которую я написал в контроллере.

Вот мой код:

ResetPwFormType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
 $builder
 ->add('username', null, array(
 'label' => 'resetting.request.username',
 'translation_domain' => 'FOSUserBundle',
 'mapped' => false
 ))
 ->add('birthday', 'date', array(
 'years' => range(date('Y') - 74, date('Y') - 18),
 'label' => 'register.user.contact.birthdayBlank',
 'translation_domain' => 'Startup',
 'mapped' => false
 ))
 ->add('plainSecurityAnswer', 'text', array(
 'label' => 'register.user.security.answer',
 'translation_domain' => 'Startup',
 'mapped' => false
 ));
}

ResettingController:

$form = $this->container->get('form.factory')->create(new ResetPwFormType());
 $form->handleRequest($this->container->get('request'));

 $username = $form->get('username')->getData();
 $birthday = $form->get('birthday')->getData();
 $securityAnswer = $form->get('plainSecurityAnswer')->getData();

 /** @var $user UserInterface */
 $user = $this->container->get('doctrine')->getRepository('UserBundle:User')->findUserForPasswordReset($username, $birthday, $securityAnswer);

 $jsonReturn = array();

 if($user !== null)
 {
 // etc.
 }

Я хотел бы использовать здесь метод "$form-> isValid()", не сохраняя каждое поле формы в переменной, передавая его методу репозитория и проверяя там, если пользователь существует вручную. И для этого, я думаю, требуется ограничение для всей формы..?

Обновление: я думаю, мне нужен класс модели для процесса сброса, и для всего этого класса я могу добавить специальное ограничение проверки.

С уважением.

2 ответа

Вы можете использовать опцию "ограничения" в построителе форм:

public function buildForm(FormBuilderInterface $builder, array $options)
{
 $builder
 ->add('username', null, array(
 'label' => 'resetting.request.username',
 'translation_domain' => 'FOSUserBundle',
 'mapped' => false,
 'constraints' => [
 new YourCustomConstraint()
 ]
 ));
}


Теперь я реализовал класс "Модель" для типа формы сброса. Там я могу добавить ограничения к свойствам (имя пользователя, день рождения, securityAnswer), а затем дополнительно добавить ограничение к самому классу.

licensed under cc by-sa 3.0 with attribution.