【问题标题】:yii2 custom validation not workingyii2 自定义验证不起作用
【发布时间】:2015-12-02 11:21:23
【问题描述】:

我需要比较模型中的 2 个属性值,只有当第一个值低于第二个值时才能验证。我尝试使用下面的代码,但它不起作用。

控制器

public function actionOpanningBalance(){

     $model = new Bill();
     if ($model->load(Yii::$app->request->post())) {
        $model->created_at = \Yii::$app->user->identity->id;
        $model->save();
      }else{
       return $this->render('OpanningBalance', [
            'model' => $model,
        ]);
     } 
}

型号

public function rules()
{
    return [
        [['outlet_id', 'sr_id', 'bill_number', 'bill_date', 'created_at', 'created_date','bill_amount','credit_amount'], 'required'],
        [['outlet_id', 'sr_id', 'created_at', 'updated_at'], 'integer'],
        [['bill_date', 'd_slip_date', 'cheque_date', 'created_date', 'updated_date','status'], 'safe'],
        [['bill_amount', 'cash_amount', 'cheque_amount', 'credit_amount'], 'number'],
        [['comment'], 'string'],
        ['credit_amount',function compareValue($attribute,$param){
               if($this->$attribute > $this->bill_amount){
               $this->addError($attribute, 'Credit amount should less than Bill amount');
    }],           
        [['bill_number', 'd_slip_no', 'bank', 'branch'], 'string', 'max' => 225],
        [['cheque_number'], 'string', 'max' => 100],
        [['bill_number'], 'unique']
    ];
}
}

它进入了验证器函数,但没有像我想要的那样添加错误

$this->addError($attribute, 'Credit amount 应该小于 Bill amount');

谁能帮我解决这个问题?

【问题讨论】:

  • 您只需致电$model->validate() ...
  • 你的意思是像 if($model->validate()){"save model"} 我做了但没用。
  • 删除函数名comparevalue.

标签: validation yii2 yii2-validation


【解决方案1】:

如果验证没有添加任何错误,则很可能会被跳过。这个问题很可能是因为默认规则行为,它会跳过空的或已经给出错误的值,如下所示:https://www.yiiframework.com/doc/guide/2.0/en/input-validation#inline-validators

具体来说:

默认情况下,如果内联验证器的关联属性接收到空输入,或者它们已经未通过某些验证规则,则不会应用内联验证器。如果您想确保始终应用规则,您可以在规则声明中将 skipOnEmpty 和/或 skipOnError 属性配置为 false。

因此,您需要根据适合您的方式设置 skipOnEmptyskipOnError 值:

[
    ['country', 'validateCountry', 'skipOnEmpty' => false, 'skipOnError' => false],
]

【讨论】:

    【解决方案2】:

    试试这个:

    public function actionOpanningBalance(){
    
     $model = new Bill();
     if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        $model->created_at = \Yii::$app->user->identity->id;
        $model->save();
      }else{
       return $this->render('OpanningBalance', [
            'model' => $model,
        ]);
     } 
    }
    

    用于验证

    你可以使用匿名函数:

    ['credit_amount',function ($attribute, $params) {
                if ($this->$attribute > $this->bill_amount)) {
                    $this->addError($attribute, 'Credit amount should less than Bill amount.');
                  return false;
                }
            }],
    

    【讨论】:

    【解决方案3】:

    你可以像这样使用下面的答案也是写

    public function rules(){
        return [
            ['credit_amount','custom_function_validation', 'on' =>'scenario'];
    }
    public function custom_function_validation($attribute){
        // add custom validation
        if ($this->$attribute < $this->cash_amount) 
            $this->addError($attribute,'Credit amount should less than Bill amount.');
    }
    

    【讨论】:

      【解决方案4】:

      我已经使用第三个参数使 custom_function_validation 工作,如下所示:

      public function is18yo($attribute, $params, $validator)
      {
          $dobDate = new DateTime($this->$attribute);
          $now = new DateTime();
          if ($now->diff($dobDate)->y < 18) {
              $validator->addError($this, $attribute, 'At least 18 years old');
              return false;
          }
      }
      

      【讨论】:

        【解决方案5】:

        这是一个后端验证,它只会在提交时触发。所以你可以在你的验证函数中尝试这样的事情。

        if (!$this->hasErrors()) {
          // Your validation code goes here.
        }
        

        如果您检查生成的basic Yii2 应用程序,您可以在文件models/LoginForm.php 中看到该示例,其中有一个名为validatePassword 的函数。

        只有在提交表单后才会触发验证。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-26
          • 1970-01-01
          • 2016-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-14
          相关资源
          最近更新 更多