Laravel 5 - 根据需要验证数组,但允许传递一个空数组

Posted

技术标签:

【中文标题】Laravel 5 - 根据需要验证数组,但允许传递一个空数组【英文标题】:Laravel 5 - validate array as required, but allow an empty array to be passed 【发布时间】:2017-09-23 22:16:49 【问题描述】:

我正在使用验证器验证 Laravel 5.4 中的请求,请参阅文档: https://laravel.com/docs/5.4/validation#validating-arrays

基本上就是Controller中的这段代码:

public function createSomeResource(Request $request)

    $this->validate($request, [
        'items' => 'required',
    ];
    ...

我想要求字段“items”的存在,这段代码做到了,但问题是当“items”字段为空数组时验证失败,即


    "fields": []

,这是不受欢迎的行为。我知道这是“必需”参数的记录行为,但我没有看到任何“干净”的解决方法。我也试过了:

public function createSomeResource(Request $request)

    $this->validate($request, [
        'items' => 'required_unless:items,[]',
    ];
    ...

但它也失败了,可能是因为文档说它在“required_unless”子句之后使用不同的字段,但我对此并不完全确定。

您能否建议我一种方法来要求存在“项目”字段而不禁止空数组?

编辑:我想到的另一种“明显”方法是使用“present|array”规则,它几乎可以满足我的要求,但不幸的是,一个空字符串也通过了该验证规则,这可能是Laravel 中的一个错误,也许不是 - 我在 Laravel github 存储库上为它打开了一个问题:https://github.com/laravel/framework/issues/18948

【问题讨论】:

跳到您链接到的文档之后的下一部分? “自定义验证规则” - 如果需要,您可以编写自己的自定义验证逻辑。 好的,这将是一种解决方案,但我认为它太麻烦了,因为如果我没有遗漏任何东西,您必须通过修改验证器外观来创建自定义验证器。我认为这个要求是一个非常基本的要求,所以我希望有一个更简单的解决方案,或者我只是想念如何很好地编写自定义验证逻辑,也许你可以给我一个代码 sn-p 解释你将如何做到这一点这种特殊情况,最好通过扩展现有的“必需”验证规则。 也许使用 $this->validate($request, [ 'items' => 'array', ]; @VaheGalstyan 在我的情况下不起作用,因为它不需要字段“items”的存在,它只需要一个数组,即没有键“items”的对象将是有效的输入,这是错误的。 【参考方案1】:

试试这个:

public function createSomeResource(Request $request)

    $this->validate($request, [
        'items' => 'present|array',
    ];
    ...

【讨论】:

是的,我试过了,它几乎可以满足我的要求,但是一个空字符串仍然可以通过验证规则(你可以在工匠修补程序中尝试),我不知道如何修复它使用现有规则:/ 我已经在 Laravel 的 github 存储库上打开了一个问题:github.com/laravel/framework/issues/18948 @RafaelK。看起来上述问题已通过使用 ConvertEmptyStringsToNull 中间件得到解决。我和你有同样的问题,present 验证修饰符工作得很好。如果对您有用,请接受答案! 谢谢,与ConvertEmptyStringsToNull完美结合【参考方案2】:

试试:

public function createSomeResource(Request $request)

    $this->validate($request, [
        'items' => 'required|array|min:1',
    ];
    ...

来自 Laravel 文档:

最小值:值 验证中的字段必须具有最小值。字符串、数字、数组和文件的评估方式与大小规则相同。

【讨论】:

【参考方案3】:

1) 需要数组

2) 所有数组的值不为空或为空

public static $rules = [
   'category' => 'required|array|min:1',
   'category.*' => 'required',
];

【讨论】:

【参考方案4】:

这应该可行

public function rules()

   return [
    "items"    => "required|array|min:0",
    "items.*"  => "required|string|distinct|min:0",
  ];

【讨论】:

【参考方案5】:

我们来了,伙计……

public function createSomeResource(Request $request)

    $validate_us_pls = [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ];


    if( !empty($request->get('items')) )
        $validate_us_pls['items'] = 'required';
    

    $this->validate($request, $validate_us_pls);


【讨论】:

【参考方案6】:

也许这会有用?

数组中的大小使用计数

 'ids'=>'present|array|size:1'

或者这个

'users' => 'required|array|between:2,4'

【讨论】:

【参考方案7】:

您的问题是因为您没有以 JSON 格式发送请求。确保您在 POSTMAN 上设置了以 JSON 格式发送请求。

【讨论】:

不,这不是我正在做的事情,看我在这里寻找解决方案:)

以上是关于Laravel 5 - 根据需要验证数组,但允许传递一个空数组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 中的图像数组验证

Laravel 验证文件数组总允许上传大小

如何在 Laravel 5 中验证路由参数?

如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入

没有 remember_token 的 Laravel 5 身份验证

Laravel 5.3 自定义验证消息数组