Yii2:整个模型对象的验证规则而不是单个属性?

时间:2015-03-18 13:59:32

标签: php validation yii2

考虑我有这样的事情:

class Dummy extends yii\base\Model {
    public $a;
    public $b;

    public function rules() {
         return [ ??? ];
    }
}

如何同时考虑属性$ a和$ b来创建验证规则?想象一下,$ a或$ b或两者都应该有一个值。如果它们都没有设置,我想得到一个单独的验证错误,例如'要么a或b必须设置'。我认为when property在这里没有帮助(我可以创建每个属性的条件,分别检查其他属性,但这会产生两个验证错误。)

上面的例子很简单。但它可能要复杂得多,也要依赖其他东西。

由于Model::addError()需要一个属性,我似乎无法做到这一点。错误取决于属性。那么我怎样才能验证整个对象,例如找出模型对象是否可以使用其当前值保存。是否有任何类型的验证在属性验证之上?更高级别的验证?

2 个答案:

答案 0 :(得分:0)

我相信您需要的是自定义验证规则:

public function rules()
{
    return [
        [['a', 'b', 'c'], 'myCustomRule'],
    ];
}

public function myCustomRule($attribute)
{
    if(!$this->a && !$this->b && !$this->c) {
        $this->addError($attribute, "One of these attributes is required: a, b, c");
    }
}

答案 1 :(得分:0)

根据guide,可以将*作为属性传递给addError($attribute, $error)。但是,由于消息未绑定到现有属性,因此消息需要与errorSummary()一起显示为ActiveForm的一部分。

模型中的规则

public function rules() {
    return [
        [['a', 'b'], 'validateAandB'],
    ];
}

验证方法:

public function validateAandB($attribute, $params) {
    $this->addError('*', 'a and/or b should have a value.');
}

以表格形式:

<?php $form = ActiveForm::begin(); ?>
    <?= $form->errorSummary($model) ?>
    <?= $form->field($model, 'a') ?>
    <?= $form->field($model, '') ?>
    <?= Html::submitButton('Submit', ['class' => 'btn btn-success']) ?>
<?php ActiveForm::end(); ?>

实际上,不需要使用*,任何字符串都可以。如果它是属性的名称,则会在输入和摘要附近显示验证错误,否则它仅显示在摘要中(摘要不显示属性的名称,只显示错误消息)。

注意,由于两个属性的验证发生,因此消息会被添加两次。但是,由于它是以相同的名称添加的(此处为:*),默认情况下,只显示属性的第一条消息,它只会显示一次。