如何在Yii2验证器方法`when`中删除代码重复?

时间:2016-07-08 08:08:58

标签: validation yii2 repeat

你必须阅读我之前的问题才能理解我在这里所说的内容(Link to my problem)。所以它解决了。

但是我的视图中有很多字段总是由当前用户的值填充。当我做下一个

时,这是代码重复
[['new_email'], 'unique', 'targetAttribute' => 'email', 'targetClass' => '\common\models\User',
            'when' => function ($model, $attribute) {
                $this->isNewEmail = false;
                if($model->$attribute != User::find()->where(['id' => Yii::$app->user->id])->one()->email) {
                    $this->isNewEmail = true;
                }
                return $this->isNewEmail;
            },
            'message' => 'This email can not be taken.'],

这个

[['first_name'], 'string', 'min' => 4, 'max' => 50,
            'when' => function ($model, $attribute) {
                $this->isNewFirstName = false;
                if($model->$attribute != User::find()->where(['id' => Yii::$app->user->id])->one()->first_name) {
                    $this->isNewFirstName = true;
                }
                return $this->isNewFirstName;
            },
        ],

等等。

我该怎么做才能删除此代码重复。或者Yii2是否存在某个模块或组件,就像我这样的情况一样?或者我的问题是否存在核心验证器?或者我永远注定要完成所有这些代码重复?)

1 个答案:

答案 0 :(得分:0)

您可以看到2 when可调用函数具有相同的结构。所以你可以编写一个简单的函数:

/**
 * @param $model ActiveRecord
 * @param $attribute string
 * @return bool
 */
public function checkUniqueAttribute($model, $attribute)
{
    return $model->$attribute != $model::find()->where(['id' => Yii::$app->user->id])->one()->$attribute;
}

并在您的规则中使用它:

[
    ['new_email'], 'unique',
    'targetAttribute' => 'email',
    'targetClass' => '\common\models\User',
    'message' => 'This email can not be taken.',
    'when' => 'checkUniqueAttribute',
],
[
    ['first_name'], 'unique',
    'targetAttribute' => 'first_name',
    'targetClass' => '\common\models\User',
    'message' => 'This first name can not be taken.',
    'when' => 'checkUniqueAttribute',
],
[['first_name'], 'string', 'min' => 4, 'max' => 50,],

希望它有用。

Goodluck,玩得开心!