Yii2: правило проверки массива?

Я могу определить правило для одного целого типа:

[['x'], 'integer']

Можно ли сказать, что x является целым массивом? Например:

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

И могу ли я указать допустимые значения в массиве?

Обновление. Из версии Yii версии 2.0.4 мы получили некоторую помощь. См. этот ответ.

Ответы

Ответ 1

В версии 2.0.4 есть новый EachValidator, который облегчает его сейчас:

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

Этого должно быть достаточно. Если значения также должны быть проверены, вы можете использовать это (с помощью 'in' validator, который фактически является RangeValidator):

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

Однако вы также можете использовать этот 'in' validator. И это возможно с версиями Yii до 2.0.4:

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

Использование 'strict' => true, вероятно, не имеет смысла, если данные отправляются клиентом и устанавливается с помощью Model- > load(). Я не совсем уверен, но я думаю, что эти значения отправляются как строки (например, "5" вместо 5).

Ответ 2

Вам может потребоваться создать пользовательские правила проверки, как показано ниже:

['x','checkIsArray']

Затем в вашей модели impelement checkIsArray:

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

Вы можете сделать все, что вам нужно, в пользовательское правило проверки.


Как упоминалось в комментарии emte, вы также можете использовать встроенный валидатор с анонимной функцией, как показано ниже:

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

Ответ 3

Если вам нужно проверить конкретный диапазон для каждого элемента массива

['x', 'required'] 

плюс

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

или

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