【问题标题】:Yii2: validation rule for array?Yii2:数组的验证规则?
【发布时间】:2014-12-02 15:25:07
【问题描述】:

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

[['x'], 'integer']

是否可以判断 x 是一个整数数组?例如:

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

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

更新:从 Yii 2.0.4 版开始,我们得到了一些帮助。见this answer

【问题讨论】:

  • 这适用于模型规则吗?你不能真正存储一个数组,也许是它的序列化。你想让自己更清楚一点吗?
  • 在我的例子中,它是一个表单的模型,它包含一些作为数组加载的复选框(使用 $modal->load(Yii::$app->request->post())。所以它不适用于 ActiveRecord 对象。
  • @Chen Asraf 使用 mongodb 可以存储数组

标签: php validation yii2


【解决方案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”验证器。这对于 2.0.4 之前的 Yii 版本是可能的:

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

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

【讨论】:

  • ['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]] 如果 x 是整数数组(不是标量类型)。应该像下面描述的那样完成 ['x', 'each', 'rule' => ['in', 'allowArray' => true, 'range' => [2, 4, 6, 8]]] .我花了一些时间来定义我到底在哪里做错了。不过感谢您的回答
  • ['x', 'each', 'rule' => ['integer']] 我在我的 SearchModel 中使用了这一行,但它不起作用......它似乎忽略了规则...为什么?
  • @webpaul 很难说。创建一个包含详细信息的新问题。
【解决方案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!');
     }
}]

【讨论】:

  • 这听起来很合理!
  • 如果不想指定新函数,可以直接在规则中使用anonyme函数
  • 最好使用is_array($this->$attribute)。如果您在此规则中有多个属性,这很有用。
【解决方案3】:

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

['x', 'required'] 

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多