Сбой объекта (с ограничениями) + createFormBuilder (с дополнительными полями) - PullRequest
0 голосов
/ 26 января 2020

У моего объекта User есть несколько свойств:

private $id;
/**
Assert\Email
*/
private $email;
/**
 * @Assert\Length( min=6, minMessage="Password is too short (min 6 symbols)" )
 */
private $password;

Я пытаюсь создать форму для смены пароля:

createFormBuilder(null, ??? data-class=UserEntity ??? )
->add('YES_CHANGE_PASS',CheckboxType::class,['required'=>false])
->add('old_password',PasswordType::class,['required'=>false])
->add('new_password', RepeatedType::class,['required'=>false])

Проблема: если я установил 'data-class = UserEntity :: class 'к этой Форме, он перестает работать (конечно, потому что у моей сущности нет свойства OLD_PASSWORD \ NEW_PASSWORD). Если я не установлю 'data-class', форма, очевидно, не будет наследовать никаких ограничений (например, ограничение пароля @Assert \ Length (min = 6))

Решение # 1 Мне не нравится: hardcode all необходимые ограничения прямо в функции createFormBuilder. Мне не нравится этот способ, потому что если однажды я захочу изменить пароль minLength, мне придется пробежаться по всему проекту в поисках таких форм, чтобы отредактировать это

Решение №2 сумасшествие: добавьте все дополнительные поля моей сущности, так что это позволит мне использовать «data-class: UserEntity» ... и ограничения ... и проверять ... но это явно плохое решение

Любые подсказки, пожалуйста?

1 Ответ

1 голос
/ 27 января 2020

Измените свою форму следующим образом:

$form=$this->createFormBuilder()
     ->add('YES_CHANGE_PASS', CheckboxType::class, array(
         'mapped'=>false,
         'required'=>false,
     ))
     ->add('old_password', PasswordType::class, array(
         'mapped'=>false,
         'required'=>false,
     ))
     ->add('new_password', RepeatedType::class, array(
         'mapped'=>false,
         'required'=>false,
     ));

Затем, когда форма отправлена:

if($form->get('YES_CHANGE_PASS')->getData()) { // <== Used asked to change password?
    if($passwordEncoder->isPasswordValid($this->getUser(), $form->get('YES_CHANGE_PASS')->getData())) { // <== Check if old password is valid
        $form->get('new_password')->getData(); // <== Do what you need with the new password.
    }
}
...