这是我使用的解决方案:
Usage
只需通过添加前缀来转换您常用的规则each
。例如:
'names' => 'required|array|each:exists,users,name'
请注意,each
规则假设您的字段是一个数组,所以不要忘记使用array
之前的规则如下所示。
错误信息
错误消息将自动以单数形式计算(使用 Laravel 的str_singular()
您所在领域的帮手)。在前面的示例中,属性是name
.
嵌套数组
此方法开箱即用,适用于点表示法中任意深度的嵌套数组。例如,这有效:
'members.names' => 'required|array|each:exists,users,name'
同样,此处用于错误消息的属性将是name
.
自定义规则
此方法支持任何开箱即用的自定义规则。
执行
1.扩展验证器类
class ExtendedValidator extends Illuminate\Validation\Validator {
public function validateEach($attribute, $value, $parameters)
{
// Transform the each rule
// For example, `each:exists,users,name` becomes `exists:users,name`
$ruleName = array_shift($parameters);
$rule = $ruleName.(count($parameters) > 0 ? ':'.implode(',', $parameters) : '');
foreach ($value as $arrayKey => $arrayValue)
{
$this->validate($attribute.'.'.$arrayKey, $rule);
}
// Always return true, since the errors occur for individual elements.
return true;
}
protected function getAttribute($attribute)
{
// Get the second to last segment in singular form for arrays.
// For example, `group.names.0` becomes `name`.
if (str_contains($attribute, '.'))
{
$segments = explode('.', $attribute);
$attribute = str_singular($segments[count($segments) - 2]);
}
return parent::getAttribute($attribute);
}
}
2. 注册您的验证器扩展
在您常用的引导位置的任何位置,添加以下代码:
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new ExtendedValidator($translator, $data, $rules, $messages);
});
就是这样!享受!
奖励:数组的大小规则
正如评论指出的那样,似乎没有简单的方法来验证数组大小。然而,Laravel 文档缺乏大小规则:它没有提到它可以计算数组元素。这意味着您实际上可以使用size
, min
, max
and between
计算数组元素的规则。