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

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

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