Yii2:数组的验证规则?

rob*_*sch 22 php validation yii2

我可以为这样的单个整数定义规则:

[['x'], 'integer']
Run Code Online (Sandbox Code Playgroud)

有可能告诉x是整数数组吗?例如:

[['x'], 'integer[]']
Run Code Online (Sandbox Code Playgroud)

我可以在数组中指定有效值吗?

更新:从Yii版本2.0.4我们得到了一些帮助.看到这个答案.

rob*_*sch 54

从版本2.0.4开始,新的EveryValidator使它现在更容易:

['x', 'each', 'rule' => ['integer']],
Run Code Online (Sandbox Code Playgroud)

这应该足够了.如果还应该检查这些值,你可以使用它(使用'in'验证器,它实际上是RangeValidator):

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]], // each value in x can only be 2, 4, 6 or 8
Run Code Online (Sandbox Code Playgroud)

但是,您也可以直接使用此"in"验证器.对于2.0.4之前的Yii版本,这是可能的:

['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true]
Run Code Online (Sandbox Code Playgroud)

'strict' => true如果数据由客户端发送并使用Model-> load()设置,则使用可能没有意义.我不太确定,但我认为这些值都是以字符串形式发送的(比如"5"而不是5).


Ali*_*our 14

您可能需要创建如下的自定义验证规则:

['x','checkIsArray']
Run Code Online (Sandbox Code Playgroud)

然后在你的模型中,要求checkIsArray:

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

您可以在自定义验证规则中执行所需操作.


正如emte在评论中提到的那样,你也可以使用带有匿名函数的内联验证器,如下所示:

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

  • 最好使用`is_array($ this - > $ attribute)`.如果此规则中有多个属性,则此选项非常有用. (4认同)
  • 如果您不想指定新功能,可以直接在规则中使用匿名功能 (3认同)

Eko*_*val 5

如果您需要检查每个数组元素的特定范围

['x', 'required'] 
Run Code Online (Sandbox Code Playgroud)

['x', 'each', 'rule' => ['in',  'allowArray' => true, 'range' => [2, 4, 6, 8]]]
Run Code Online (Sandbox Code Playgroud)

或者

['x', 'in', 'allowArray' => true,  'range' => [2, 4, 6, 8] ]  
Run Code Online (Sandbox Code Playgroud)