0
votes

My User entity has few properties:

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

I'm trying to create a Form for changing 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])

Problem: if I set the 'data-class=UserEntity::class' to this Form, it stops working (of course, because my Entity doesn't have OLD_PASSWORD\NEW_PASSWORD property). If I don't set 'data-class', the Form obviously won't inherit any constraints (like password @Assert\Length(min=6) constraint)

Solution#1 I dont like: hardcode all the needed constraints right in the createFormBuilder function. I dont like this way because if one day I want to change the Password minLength, I'll have to run through the whole project searching for such forms to edit this

Solution#2 madness: add all the extra fields to my Entity, so it will let me use the 'data-class:UserEntity'... and constraints...and validate... but it's obviously a sick solution

Any hints, please?

1
Set data-class to User entity but handle old password and new password as unmapped fields. In your controller check old password with database, and validate new password. If validation is successfull then encode plain password and set entity password property with encoded password and flush(); - Frank B
Get your unmapped formfield (['mapped' => false]) like this: $new_password = $form->get('new_password')->getData(); - Frank B
thanks guys, totally forgot about 'unmapped' >.< - kotaries

1 Answers

1
votes

Change your form to this :

$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,
     ));

Then, when the form is submitted :

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.
    }
}