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] ]