web-dev-qa-db-fra.com

Yii2: règle de validation du tableau?

Je peux définir une règle pour un seul entier comme ceci:

[['x'], 'integer']

Est-il possible de dire que x est un tableau entier? Par exemple:

[['x'], 'integer[]']

Et puis-je spécifier les valeurs valides dans le tableau?

Mise à jour : De Yii version 2.0.4 nous avons de l'aide. Voir cette réponse .

22
robsch

Depuis la version 2.0.4, il y a le nouveau EachValidator qui le rend plus facile maintenant:

['x', 'each', 'rule' => ['integer']],

Cela devrait être suffisant. Si les valeurs doivent également être vérifiées, vous pouvez utiliser ceci (avec le validateur 'in' qui est en fait le RangeValidator):

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]], // each value in x can only be 2, 4, 6 or 8

Cependant, vous pouvez également utiliser directement ce validateur 'in'. Et cela est possible avec les versions Yii antérieures à 2.0.4:

['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true]

L'utilisation de 'strict' => true n'aurait probablement aucun sens si les données sont envoyées par le client et sont définies avec Model-> load () . Je ne suis pas sûr mais je pense que ces valeurs sont toutes envoyées sous forme de chaînes (comme "5" au lieu de 5).

52
robsch

Vous devrez peut-être créer des règles de validation personnalisées comme ci-dessous:

['x','checkIsArray']

Ensuite, dans votre modèle, impelement checkIsArray:

public function checkIsArray(){
     if(!is_array($this->x)){
         $this->addError('x','X is not array!');
     }
}

Vous pouvez faire tout ce dont vous avez besoin dans une règle de validation personnalisée.


Comme emte mentionné dans le commentaire, vous pouvez également utiliser un validateur en ligne avec une fonction anonyme comme ci-dessous:

['x',function ($attribute, $params) {
    if(!is_array($this->x)){
         $this->addError('x','X is not array!');
     }
}]
15
Ali MasudianPour

Si vous devez vérifier par rapport à une plage spécifique pour chaque élément du tableau

['x', 'required'] 

plus

['x', 'each', 'rule' => ['in',  'allowArray' => true, 'range' => [2, 4, 6, 8]]]

ou

['x', 'in', 'allowArray' => true,  'range' => [2, 4, 6, 8] ]  
3
Ekonoval