Laravel 通配符 (*) 点表示法的自定义验证消息
Laravel custom validation message for wildcard (*) dot notation
在为具有相同数组名称的表单元素定义验证时,我们使用通配符 (*) 点表示法
假设您有一个如图所示的表单:
<input type="text" name="client_type[]" class="form-control" value="Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">
<input type="text" name="client_type[]" class="form-control" value="Non Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">
为了验证 commission_percentage
字段,我们将在表单请求中执行此操作 class:
public function rules()
{
$rules = [];
$rules['commission_percentage.*'] = 'required';
return $rules;
}
从上面的表单中,当它为空时提交会生成以下验证错误消息:
The commission_percentage.0 field is required.
The commission_percentage.1 field is required
验证错误消息将重复两次,因为表单中的 commission_percentage
数组有 2 个值。现在想象一下数组有多个值的情况,每次都会重复验证错误消息!
所以问题是:是否有解决此问题的方法,而不是重复验证错误消息 n
次,我们有一个验证错误消息将被输出并代表所有项目在同一个数组中?
谢谢。
我认为您可以覆盖表单请求中的消息方法并添加一条消息,例如:
public function messages()
{
return [
'commission_percentage.*' => 'Your field is required'
];
}
然后要在视图中使用它,您应该将它从 $errors->any()
循环中排除,但要将其作为单个错误获取,如下所示:
@if ($errors->has('commission_percentage.*'))
<div class="help-block">
<ul role="alert">
<li>{{ $errors->first('commission_percentage.*') }}</li>
</ul>
</div>
@endif
所以@nakov 上面的回答启发了这个解决方案:
我正在使用 ajax
来 post 我的表格。要避免同一数组的值出现 +n
验证错误消息:
$.ajax({
url: postUrl,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false
})
.done(function( data ) {
//
})
.fail(function(data) {
if( data.status === 422 )
{
var errorResponse = JSON.parse(data.responseText);
var errors= '';
errors += '<ul>';
var commissionError = '';
$.each( errorResponse.errors, function( key, value ) {
if (key.indexOf('commission_percentage') > -1)
{
commissionError = value;
}
else
{
errors += '<li>' + value + '</li>';
}
});
commissionError = '<li>' + commissionError + '</li>';
errors = errors + commissionError;
errors += '</ul>';
$('#role-errors').children('.alert').html(errors).css({ 'display':'block', 'padding': '1rem' });
}
所以,我定义了 commissionError
变量,检查了 commission_percentage
键的存在,如我的表单请求规则中所定义的,捕获匹配的值并将其显示在我的循环之外:
commissionError = '<li>' + commissionError + '</li>';
然后连接到主 errors
字符串,如图所示:
errors = errors + commissionError;
就是这样!现在 commission_percentage
下的所有必需属性都由一条验证错误消息表示。整洁!
如果您将所有错误消息集中在视图中的一个位置,您可以使用 unique
方法而不是 all
,例如:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->unique() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
如果您为规则指定了一条自定义消息,就像@nakov 的回答:
public function messages()
{
return [
'commission_percentage.*.required' => 'Your field is required'
];
}
在为具有相同数组名称的表单元素定义验证时,我们使用通配符 (*) 点表示法
假设您有一个如图所示的表单:
<input type="text" name="client_type[]" class="form-control" value="Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">
<input type="text" name="client_type[]" class="form-control" value="Non Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">
为了验证 commission_percentage
字段,我们将在表单请求中执行此操作 class:
public function rules()
{
$rules = [];
$rules['commission_percentage.*'] = 'required';
return $rules;
}
从上面的表单中,当它为空时提交会生成以下验证错误消息:
The commission_percentage.0 field is required.
The commission_percentage.1 field is required
验证错误消息将重复两次,因为表单中的 commission_percentage
数组有 2 个值。现在想象一下数组有多个值的情况,每次都会重复验证错误消息!
所以问题是:是否有解决此问题的方法,而不是重复验证错误消息 n
次,我们有一个验证错误消息将被输出并代表所有项目在同一个数组中?
谢谢。
我认为您可以覆盖表单请求中的消息方法并添加一条消息,例如:
public function messages()
{
return [
'commission_percentage.*' => 'Your field is required'
];
}
然后要在视图中使用它,您应该将它从 $errors->any()
循环中排除,但要将其作为单个错误获取,如下所示:
@if ($errors->has('commission_percentage.*'))
<div class="help-block">
<ul role="alert">
<li>{{ $errors->first('commission_percentage.*') }}</li>
</ul>
</div>
@endif
所以@nakov 上面的回答启发了这个解决方案:
我正在使用 ajax
来 post 我的表格。要避免同一数组的值出现 +n
验证错误消息:
$.ajax({
url: postUrl,
type: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false
})
.done(function( data ) {
//
})
.fail(function(data) {
if( data.status === 422 )
{
var errorResponse = JSON.parse(data.responseText);
var errors= '';
errors += '<ul>';
var commissionError = '';
$.each( errorResponse.errors, function( key, value ) {
if (key.indexOf('commission_percentage') > -1)
{
commissionError = value;
}
else
{
errors += '<li>' + value + '</li>';
}
});
commissionError = '<li>' + commissionError + '</li>';
errors = errors + commissionError;
errors += '</ul>';
$('#role-errors').children('.alert').html(errors).css({ 'display':'block', 'padding': '1rem' });
}
所以,我定义了 commissionError
变量,检查了 commission_percentage
键的存在,如我的表单请求规则中所定义的,捕获匹配的值并将其显示在我的循环之外:
commissionError = '<li>' + commissionError + '</li>';
然后连接到主 errors
字符串,如图所示:
errors = errors + commissionError;
就是这样!现在 commission_percentage
下的所有必需属性都由一条验证错误消息表示。整洁!
如果您将所有错误消息集中在视图中的一个位置,您可以使用 unique
方法而不是 all
,例如:
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->unique() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
如果您为规则指定了一条自定义消息,就像@nakov 的回答:
public function messages()
{
return [
'commission_percentage.*.required' => 'Your field is required'
];
}