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 - 根据需要验证数组,但允许传递一个空数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入