Пользовательское ограничение Symfony для функции сброса пароля

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

Вот мой код:

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 ()», не сохраняя каждое поле формы в переменной, передавая его методу репозитория и проверяя, существует ли пользователь вручную. И для этого, я думаю, что ограничение для всей формы требуется ..?

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

С уважением.

0

Решение

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

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

Другие решения

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

-1