你必须阅读我之前的问题才能理解我在这里所说的内容(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是否存在某个模块或组件,就像我这样的情况一样?或者我的问题是否存在核心验证器?或者我永远注定要完成所有这些代码重复?)
答案 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,玩得开心!