复选框数组的验证规则 "between" 始终有效

Validation rule "between" for array of checkboxes always valid

如果有几个显示带有排名的选择 ID 的问题(选中的第一个复选框是第一选择,等等)。这是通过以下表单发送的简化 var_dump($_POST)

Array
(
    [_token] => 6vPgIM1MX7MJ0DzMX2OFjCdPEBBel5mRJ6RzrEjR
    [11] => Array // Means question id 11
        (
            [42] => 2 // Means choice id 42 was chosen second
            [43] => 1 // Means choice id 43 was chosen first
            [44] => 3 // Means choice id 44 was chosen third
        )

    [12] => 

    [13] => Array
        (
            [4] => 1
        )

    [btn-validate] => CONTINUE
)

那么我的var_dump($validationRules)如下:

Array
(
    [11] => Array
        (
            [0] => between:0,2
        )

    [12] => Array
        (
            [0] => between:1,3
        )

    [13] => Array
        (
            [0] => between:0,1
        )
)

最后 var_dump($validationMessages)(不过这里没那么重要):

Array
(
    [11.between] => You should select between 0 and 2 choices
    [12.between] => You should select between 1 and 3 choices
    [13.between] => You should select between 0 and 1 choices
)

这一切都是这样包装的:

$validator = Validator::make($request->all(), $validationRules, $validationMessages);

if ($validator->fails()) {
    var_dump($validator->errors());
    exit('fail'); // Never ends up here
}
exit('all good'); // Always ends up here

如何使 between:x,y 验证规则适用于值数组?

我认为您误解了 between 规则对数组的作用。

来自between rule docs

(...) Strings, numerics, arrays, and files are evaluated in the same fashion as the size rule.

来自size rule docs

(...) For an array, size corresponds to the count of the array. (...)

意味着您指定的验证规则意味着计算每个数组值的计数。在每种情况下,这些都被评估为 true,因为在您的每种情况下计数都是 1。

将此作为您的复选框 //blade 文件

<div class="form-group">
    <label for="likes_turtles" class="col-md-3 control-label">Likes Turtles</label>
    <div class="col-md-6">
        <div class="checkbox">
            <label>
                <input type="checkbox" name="likes_turtles[]" value="Yes"> Yes
            </label>
        </div>
        <div class="checkbox">
            <label>
                <input type="checkbox" name="likes_turtles[]" value="No"> No
            </label>
        </div>
        <div class="checkbox">
            <label>
                <input type="checkbox" name="likes_turtles[]" value="Maybe so"> Maybe so
            </label>
        </div>
    </div>
</div>

然后你在控制器中验证如下代码

[
    "likes_turtles" => "required", 
    "likes_turtles.*" => "in:Yes,No,Maybe so"
]

解决了问题。

我的所有规则都没有问题,问题是 Laravel 的验证系统不支持整数作为 $_POST

Laravel 问题: https://github.com/laravel/framework/issues/29116