Я могу определить правило для одного целого типа:
[['x'], 'integer']
Можно ли сказать, что x является целым массивом? Например:
[['x'], 'integer[]']
Могу ли я указать допустимые значения в массиве?
Обновление : с версии Yii версии 2.0.4 мы получили некоторую помощь. См. Этот ответ .
Из версии 2.0.4 появился новый EveryValidator, который упрощает работу:
['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
Однако вы также можете использовать этот «валидатор». И это возможно с версиями Yii до 2.0.4:
['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true]
Использование 'strict' => true
, вероятно, не имеет смысла, если данные отправляются клиентом и устанавливается с помощью Model-> load () . Я не совсем уверен, но я думаю, что эти значения передаются как строки (например, «5» вместо 5).
Возможно, вам придется создавать собственные правила проверки, как показано ниже:
['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!'); } }]
Если вам нужно проверить определенный диапазон для каждого элемента массива
['x', 'required']
плюс
['x', 'each', 'rule' => ['in', 'allowArray' => true, 'range' => [2, 4, 6, 8]]]
или
['x', 'in', 'allowArray' => true, 'range' => [2, 4, 6, 8] ]