Laravel 验证表单数组中的至少一项
Posted
技术标签:
【中文标题】Laravel 验证表单数组中的至少一项【英文标题】:Laravel validate at least one item in a form array 【发布时间】:2018-01-27 05:54:58 【问题描述】:我有一个包含一系列数字的表格:
<input type="number" name="items[ $sku ]" min="0" />
<input type="number" name="items[ $sku ]" min="0" />
<input type="number" name="items[ $sku ]" min="0" />
我想验证这些输入字段中至少有一个具有值。
我在 OrderCreateRequest 中尝试了以下操作,但测试通过了:
return [
'items' => 'required|array|min:1'
];
我错过了什么吗?
【问题讨论】:
【参考方案1】:您可以为数组和 foreach 元素设置规则。
public function rulez(Request $req)
$v = Validator::make($req->all(), [
'items' => 'required|array|min:1',
'items.*' => 'required|integer|between:0,10'
]);
if ($v->fails())
return $v->errors()->all();
第一条规则说 items 必须是一个至少包含 1 个元素的数组。 第二条规则是项目的每个元素必须是 0 到 10 之间的整数。
如果规则似乎不起作用,请尝试转储您的 $req->all()。
dump($req->all());
【讨论】:
这意味着输入数组的所有元素都是必需的,并且它们可以最小为 1。他想要一个验证规则,使得数组的至少一个元素是必需的,其他元素是可选的。 ok,你可以使用'items' => 'required|array|min:1'
你确定接收到Request参数正确吗?
请添加一个简短的解释。
我不是问这个问题的人。【参考方案2】:
$this->validate($request,[
'item'=>'required|min:1'
]);
【讨论】:
【参考方案3】:我认为您需要一个像下面这样的自定义验证规则,因为 min 不适用于数组的元素。
Validator::extend('check_array', function ($attribute, $value, $parameters, $validator)
return count(array_filter($value, function($var) use ($parameters) return ( $var && $var >= $parameters[0]); ));
);
您可以创建 ValidatorServiceProvider 并将这些行添加到 ValidatorServiceProvider 的引导方法中。然后你需要在 config/app.php 中将 Provider 添加到你的 providers 数组中。
App\Providers\ValidatorServiceProvider::class,
或者您只需将它们添加到控制器的操作顶部。
最后,您可以在验证规则中像这样使用它。
'items' => 'check_array:1',
注意:如果我理解正确,它可以工作。
【讨论】:
很好的解决方案!谢谢。 别忘了将'check_array' => 'at least one item is required',
添加到langs/*/validation.php
由于某种原因,现在总是返回 0
check sandbox.onlinephpfunctions.com/code/…
您的代码有一些逻辑错误。所以你应该像这样尝试sandbox.onlinephpfunctions.com/code/…
日期 01/08/2021 的字符串值无法通过验证器(php 7.4.8),因为参数是字符串并且斜线会破坏行为,我会改用 !empty($var)
跨度>
【参考方案4】:
如果您在控制器文件中使用它,那么我猜它应该是
$this->validate($request, [
'items' => 'required|min:1'
]);
或者这个
$validator = Validator::make($request->all(), [
"items.*" => 'required|min:1',
]);
您也可以参考How to validate array in Laravel?。
【讨论】:
第二个带有items.*
的示例将检查 items 数组中的所有值是否应至少包含 1 个字符,但在这里我们必须验证数组中至少应有 1 个元素,因此,首先示例是正确的,但第二个是错误的,因为它会检查值。
第一个例子也是错误的,因为它会传递一个带有单个空值的数组。这个答案没有解决问题,不应该被赞成。【参考方案5】:
'items' => 'required|array', // validate that field must be from array type and at least has one value
'items.*' => 'integer' // validate that every element in that array must be from integer type
您可以为这些元素添加任何其他验证规则,例如:'items.*' => 'integer|min:0|max:100'
【讨论】:
min
属性与计数项目无关,而是检查值本身
@behz4d 以及我检查元素的意思。 *
这里的意思是对这个数组中的每个元素应用规则。不检查计数【参考方案6】:
除了 Hakan SONMEZ 的回答之外,要检查是否设置了至少一个数组元素,可以使用 Rule 对象。例如创建规则类并将其命名为 ArrayAtLeastOneRequired()。
创建新规则类运行控制台命令:
php artisan make:rule ArrayAtLeastOneRequired
然后在创建的类中编辑方法pass():
public function passes($attribute, $value)
foreach ($value as $arrayElement)
if (null !== $arrayElement)
return true;
return false;
使用此规则检查数组的至少一个元素是否不为空:
Validator::make($request->all(), [
'array' => [new ArrayAtLeastOneRequired()],
]);
【讨论】:
很好的答案!请注意,验证规则应应用于数组'array'
,而不是数组元素'array.*'
,否则foreach 循环将无法迭代。【参考方案7】:
接受的答案是好的,它工作正常,但如果你不想创建函数和其他东西,那么我使用的另一个解决方法是
您可以直接将数组的元素声明为items.0
并要求输入,它不会关心其他输入,但它会要求第一个输入,它并非在所有情况下都可用,但在我的情况下很有用。
在你的OrderCreateRequest
:
public function rules()
return [
"items.0" => "required",
];
如果您的项目不是动态的并且数量不是很大,那么您可以使用required_without_all
,如下所示:
public function rules()
return [
"items.0" => "required_without_all:items.1,items.2",
"items.1" => "required_without_all:items.0,items.2",
"items.2" => "required_without_all:items.0,items.1",
];
【讨论】:
【参考方案8】:$valid = Validator($request->all(), [
'type' => 'required|string|in:city,region,country',
]);
if ($valid->fails()) return response()->json($valid->errors(), 400);
【讨论】:
口头解释通常很有帮助 这个答案不正确,没有回答问题。【参考方案9】:“大小”规则用于匹配确切的编号。数组中的项目数(如果传入参数是一个数组),“min”规则也是如此,即它计算最小编号。数组中的元素个数(如果传入参数是数组)
$this->validate($request, ['my_array' => 'size:6']); // array must have 6 items
$this->validate($request, ['my_array' => 'min:1']); // there must be 1 item in array
https://laravel.com/docs/8.x/validation#rule-size
【讨论】:
以上是关于Laravel 验证表单数组中的至少一项的主要内容,如果未能解决你的问题,请参考以下文章