Search code examples
phpjsonyii2yii2-basic-app

How to get Attribute and Error Message on Specific Field YII2 in JSON


Validation Rule :

public function rules()
{
   return [
      [['name', 'email', 'password'], 'required'],
      [['email'], 'unique'],
      [['password'],'string', 'min' => 6],
   ];
}

Scenario

public function signup() {
   if (!$this->validate(array('name')) {
      $register_errors['field'] = 'name';
      $register_errors['message'] = $this->getErrors('name');
   }

   if (!$this->validate(array('email')) {
      $register_errors['field'] = 'email';
      $register_errors['message'] = $this->getErrors('email');
   }

   if (!$this->validate(array('password')) {
      $register_errors['field'] = 'password';
      $register_errors['message'] = $this->getErrors('password');
   }
}

Return value

if (!$this->validate) {
   $register_errors['error'] = true;
   return json_encode($register_errors);
}

Result : always return

{"field":["Email cannot be blank."],"message":[],"error":true}

How to properly return all field, error, and message of every field in JSON?

Thanks


Solution

  • You assign the result always to the same index so you get only the last message
    Try concat the message usinng .=

    public function signup() {
       if (!$this->validate(array('name')) {
          $register_errors['field'] = 'name';
          $register_errors['message'] = $this->getErrors('name');
       }
    
       if (!$this->validate(array('email')) {
          $register_errors['field'] = 'email';
          $register_errors['message'] .= $this->getErrors('email');
       }
    
       if (!$this->validate(array('password')) {
          $register_errors['field'] = 'password';
          $register_errors['message'] .= $this->getErrors('password');
       }
    }
    

    or assign the different message to different $register_errors['message'][]

    public function signup() {
       if (!$this->validate(array('name')) {
          $register_errors['field'] = 'name';
          $register_errors['message'][] = $this->getErrors('name');
       }
    
       if (!$this->validate(array('email')) {
          $register_errors['field'] = 'email';
          $register_errors['message'][] = $this->getErrors('email');
       }
    
       if (!$this->validate(array('password')) {
          $register_errors['field'] = 'password';
          $register_errors['message'][] = $this->getErrors('password');
       }
    }
    
    var_dump(  $register_errors['message']);