Php 在Yii中实现强制空验证?

Php 在Yii中实现强制空验证?,php,yii,Php,Yii,我正在实施一种验证码类型,即bot检查,不让用户填写令人恼火的捕获,而是创建一个名为password_confirm的隐藏字段,然后在检查发布的变量时,如果它包含值,则会出错 我已经读过很多书,显然最好在beforeValidate()事件处理程序中实现,而不是创建新的验证规则 但是,我不确定如何停止该进程,以及如果有必要,如何返回错误消息,因为当调用validate()时,它将清除所有现有的错误消息 也不太确定我们是否可以使用场景设置它,所以只有在注册场景中才适用 在窗体窗口小部件中: <

我正在实施一种验证码类型,即bot检查,不让用户填写令人恼火的捕获,而是创建一个名为password_confirm的隐藏字段,然后在检查发布的变量时,如果它包含值,则会出错

我已经读过很多书,显然最好在beforeValidate()事件处理程序中实现,而不是创建新的验证规则

但是,我不确定如何停止该进程,以及如果有必要,如何返回错误消息,因为当调用validate()时,它将清除所有现有的错误消息

也不太确定我们是否可以使用场景设置它,所以只有在注册场景中才适用

在窗体窗口小部件中:

<div class="row">
        <?php echo $form->hiddenField($model, 'password_confirm'); ?>
        <?php echo $form->error($model,'password_confirm'); ?>
    </div>
我得到一个未定义的属性错误:因此我添加到用户模型:

public $password_confirm; 

但是注册之后,除了应用程序日志之外,它没有显示任何内容。这里可能有很多问题,我为这个复杂的问题感到抱歉。

首先,您在表单中使用了一个隐藏字段,它是隐藏的,您将无法看到或正常填充它!因此,将其更改为密码字段

您可以使用特定的场景新建模型,并使用检查该场景,我还认为beforeValidate()是一个很好的地方

当您的逻辑发生时,您可以向特定属性添加错误,并手动执行
返回false
停止进程

当验证失败时,您可以处理所有出错的问题

protected function beforeValidate() 
    {
    if(empty($this->password_confirm)) 
        {
            $this->addError('password_confirm','You crazy bot... go away');
        }
        else 
        {
            return parent::beforeValidate();
        }
    }
当然,如果验证失败,您可以使用
$this->addError($attribute,$message)添加错误


此处,$attribute是要添加错误的字段名,而$message是要显示的消息,您将无法看到或正常填充该消息正确,因此我会被骗填写字段,但普通用户不会。因此,当它被填满时,我知道它是一个机器人。你到底想不想填满它?!决定人:D。你说如果没有填写,你想显示错误,对吗?不正确,读“如果它包含一个值,将产生错误。”然后我建议你将它设置为一个可见的文本/密码字段,并使用javascript隐藏它。它是否可见真的不重要,关键是将你的逻辑放在beforeValidate()中检查逻辑并在那里执行必要的功能,包括添加错误和。。。
protected function beforeValidate() 
    {
    if(empty($this->password_confirm)) 
        {
            $this->addError('password_confirm','You crazy bot... go away');
        }
        else 
        {
            return parent::beforeValidate();
        }
    }