假设我们有以下表单数据:
{age: 15, father: "John Doe"}
字符串
我们希望在基于同一项的其他数据验证father
字段背后有一些复杂的逻辑(在本例中,我们希望在年龄< 18时验证father至少有5个字符)。
可以这样做:
Standard validation rules: ['age': 'required|integer']
$validator->sometimes('father', 'required|min:5', function($data) {
return $data['age'] < 18;
});
型
现在,我们想用一个项目列表来做同样的事情。现在,我们有以下表单数据:
[
{age: 25, },
{age: 15, father: "John Doe"},
{age: 40, },
]
型
通用验证规则现在如下所示:
['items.*.age': 'required|integer']
型
我现在的问题是轻松地表达每个项目的father
字段的sometimes
规则,该规则将取决于项目的age
字段。
$validator->sometimes('items.*.father', 'required|min:5', function($data) {
// Does not work anymore: return $data['age'] < 18;
// Any way to know which item we are dealing with here?
});
型
我能想到的一种方法是在验证器after
回调中循环这些项。但这似乎并不优雅:(
3条答案
按热度按时间hmmo2u0o1#
无法让
sometimes()
以您需要的方式工作。sometimes()
不会在数组项上“循环”,它只被调用一次。我想出了一个替代方法,它并不完美,但也许你会发现它很有用。
字符串
好奇地想知道如何改进。
jyztefdp2#
我能找到的最短的工作方法是这样的:
字符串
任何时候一个人需要一个父亲,它应该至少有5个字符。当一个人的年龄在18岁以下时,需要父亲。
required_if
处理多个用逗号分隔的方程。因此,我将0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
写成implode(',',range(0,18))
来获得该部分。我使用的测试设置:
控制器(使用HomeController)
型
查看(test.blade.php)
型
路线
型
jogvjijk3#
我使用Validator类的sometimes方法的回调函数的第二个参数的值来实现它。下面是我如何使用laravel 8完成的。
字符串