2016-07-08 4 views
0

Sie müssen mein vorheriges Problem lesen, um zu verstehen, worüber ich hier spreche (Link to my problem). So wurde es gelöst.Wie Code Wiederholung in Yii2 Validatoren Methode `wann 'zu entfernen?

Aber ich habe eine Menge Felder in meiner Ansicht, die immer durch den aktuellen Benutzerwert gefüllt sind. Und es ist Codewiederholung, wenn ich nächstes tun

[['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.'], 

Und das

[['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; 
      }, 
     ], 

und so weiter.

Was kann ich tun, um diese Codewiederholung zu entfernen? Oder gibt es irgendwo existiert Modul oder Komponente für Yii2 genau wie für diese Situation wie meins? Oder gibt es irgendwo Core Validator für mein Problem? Oder ich verdammt für immer, all diese Code-Wiederholung zu tun?)

+0

warum machst du das nicht vor model-> validate()? bieten auch mehr von Ihnen Aktion PHP-Code –

Antwort

0

Sie können sehen, dass 2 when aufrufbare Funktion gleiche Struktur haben. So können Sie eine einfache Funktion wie das schreiben:

/** 
* @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; 
} 

und verwenden Sie es in Ihren Regeln:

[ 
    ['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,], 

Hoffe, dass es nützlich ist.

Goodluck und viel Spaß!

+1

Ja, das ist gut. Aber es gibt nicht immer meine Feldnamen im Modell ist gleich Feldnamen in der Datenbank in der Tabelle (aber ich denke, dass es Teig sein wird, um gleiche Namen meiner Eigenschaften in meinem Modell und gleiche Namen meiner Felder in der Tabelle der Datenbank zu haben) – Link

+0

And Ich möchte vermeiden, meine Datenbank zu berühren, wenn mein Feld genau dasselbe wie ich Datenbank ist. – Link