1

I am new to this Symfony framework and ran into a dead end during implementation. I am required to validate new password and confirm password fields only if current password of the user is entered.

I tried my best to understand the concept by going though these links,

But turns out either the classes used are deprecated or required an entity.

The implementation of the two fields are as follows,

//if this field is filled
$builder->add('currentPassword', 'password', array('label'=>'Current Password',                                            
                                      'required'=>false,                                          
                                      'attr'=>array('class'=>'form-control'),                                           
                                      'error_bubbling' => true,
                                      'trim' => true,
                                      'mapped' => false,
                                      'label_attr'=>array('class'=>'col-sm-4 control-label')));

//These repeated fields must be filled or must be set as required
$builder->add( 'password', 'repeated', array( 'type' => 'password',                                          
                                      'required' => false,        
                                      'invalid_message' => ErrorMessages::PASSWORDS_DO_NOT_MATCH,
                                      'options' => array('attr' => array('class' => 'password-field form-control')),                                                                                   
                                      'first_options'  => array('label' => false,  
                                                                'error_bubbling' => true,
                                                                'label_attr'=>array('class'=>'col-sm-4 control-label')),
                                      'second_options' => array('label' => false,                                                                    
                                                                'label_attr'=>array('class'=>'col-sm-4 control-label')))); 

I implemented a validation using a bunch of if conditions within the controller but it would be great to learn the proper way of performing validations for a scenario such as this. :)

Thank you

EDIT

the user entity

    <?php
    namespace Proj\Bundle\AccountsBundle\Entity;

    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Proj\Bundle\AccountsBundle\Custom\ErrorMessages;



    class User implements UserInterface, \Serializable {    

      /**
       * @Assert\Email(message=ErrorMessages::EMAIL_ADDRESS_INVALID)
       * @Assert\NotBlank(message=ErrorMessages::EMAIL_ADDRESS_EMPTY)
       */
      private $email;

      /**     
       * @Assert\NotBlank(message=ErrorMessages::PASSWORD_EMPTY, groups={"full"})
       */
      private $password;

      private $oldPassword;

      private $id;
      private $userId;
      private $name;
      private $username;



      public function __construct() {

      } 

      function setEmail ($email) {
        $this->email = $email;
        $this->username = $email;
      }

      function getEmail () {
        return $this->email;
      }

      function setPassword ($password) {
        $this->password = $password;
      }

      function getPassword () {
        return $this->password;
      }

      function setOldPassword ($oldPassword) {
        $this->oldPassword = $oldPassword;
      }

      function getOldPassword () {
        return $this->oldPassword;
      }

      function setId ($id) {
        $this->id = $id;
      }

      function getId () {
        return $this->id;
      }

      function setUserId ($userId) {
        $this->userId = $userId;
      }

      function getUserId () {
        return $this->userId;
      }

      function setName (PersonName $name) {
        $this->name = $name;
      }

      function getName () {
        return $this->name;
      }

      public function eraseCredentials() {

      }

      public function getRoles() {
        return array('ROLE_USER');
      }

      public function getSalt() {

      }

      public function getUsername() {
        return $this->username;
      }

    }
Community
  • 1
  • 1
Hasitha Shan
  • 2,900
  • 6
  • 42
  • 83

1 Answers1

0

Modify your class as follows

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;

/**
 *
 * @Assert\Callback(methods={"passwordVerify"})
 */
class User implements UserInterface, \Serializable {
  //all your old code here
  public function passwordVerify(ExecutionContext $context)
  {
    //your controls about password fields here
    //in case of failure you can add that snippet of code
    $context->addViolationAtPath($propertyPath,'your message here', array(), null);
  }
}

Of course you have to be able to access all informations into passwordVerify function and the quickest method to do this is to create the field verifyPassword into your entity so when you bind form with entity all data will be there.

That snippet of code will call automatically a callback method when you use isValid() form's method

DonCallisto
  • 29,419
  • 9
  • 72
  • 100