Yii2自定义验证规则不起作用

时间:2016-10-15 15:42:32

标签: validation yii2 rules

我正在尝试为yii2中的模型编写一些自定义验证,但我无法弄清楚为什么验证始终是正面的,尽管我的验证函数总是会添加错误。 例如规则

   public function rules()
{
    return [
       ...
        [['myattribute'], 'myvalidation'],
   ];
}

public function myvalidation($attribute, $params)
{
  $this->addError($attribute, "error");
}

validate()函数仍然返回true。有什么问题?

3 个答案:

答案 0 :(得分:0)

在验证规则中添加skipOnError =>假

[
  ['myattribute', 'myvalidation',  'skipOnError' => false],
]

然后

$model->validate(); // should return false;

答案 1 :(得分:0)

我建议你注意这个lesson on custom rolesread docs就可以了。它不是最好的视频教程,但这个人让它正常工作。

在你的情况下:

1.在[['myattribute'], 'myvalidation'],中从此处删除额外数组,使您的模型规则和自定义数值函数看起来像这样

public function rules()
{
    return [
       ...
        ['myattribute', 'myvalidation'],
   ];
}

public function myvalidation($attribute, $params)
{
  $this->addError($attribute, "error");
}

没错,但是当你有多个属性时就会使用它。

2.然后转到你的表单并将``放到你的ActiveForm中,这样看起来就像这样

<?php $form = ActiveForm::begin(['enableAjaxValidation' => true]); ?>

我的意思是,如果你想在不重新加载的情况下验证它(使用ajax),你需要这样做。

3.另外将此添加到控制器与视图相关联的操作

if(Yii::$app->request->isAjax && $model->load($_POST)) {
            Yii::$app->response->format = 'json';
            return \yii\widgets\ActiveForm::validate($model);
}

这将通过ajax验证您在表单中的输入,如果它不是ajax,则无效。

答案 2 :(得分:0)

['reg_date','validateDate', 'skipOnEmpty' => false, 'skipOnError' => false]

将此添加到您的规则

public function validateDate($attribute,$params,$validator)
    {
        
            $validator->addError($this,$attribute,"Bugungi sana bo'lishi kerak!");
    }

像这样在您的控制器端进行检查

if($model->validate()){
echo "validate works";
}