通配符(*)点符号的Laravel自定义验证消息

通配符(*)点符号的Laravel自定义验证消息,laravel,laravel-validation,Laravel,Laravel Validation,当为具有相同数组名称的表单元素定义验证时,我们使用通配符(*)点表示法 假设您有一个表单,如图所示: <input type="text" name="client_type[]" class="form-control" value="Panelist" readonly> <input type="number" name="commission_percentage[]" class="form-control"> <input type="text" na

当为具有相同数组名称的表单元素定义验证时,我们使用通配符(*)点表示法

假设您有一个表单,如图所示:

<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">
errors = errors + commissionError;
从上面的表单中,在其为空时提交将生成以下验证错误消息:

The commission_percentage.0 field is required. 
The commission_percentage.1 field is required
验证错误消息将重复两次,因为表单中的
commission\u percentage
数组有2个值。现在想象一个数组有多个值的情况,每次都会重复验证错误消息

因此,问题是:是否有一种解决方法,以使验证错误消息不再重复
n
多次,而是有一条验证错误消息将被输出并表示同一数组中的所有项


谢谢。

我认为您可以覆盖表单请求中的messages方法并添加一条消息,例如:

public function messages()
{
    return [
        'commission_percentage.*' => 'Your field is required'
    ];
}
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->unique() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
然后,要在视图中使用它,您应该将其从
$errors->any()
循环中排除,但要将其作为一个单独的错误获取,如下所示:

@if ($errors->has('commission_percentage.*'))
    <div class="help-block">
        <ul role="alert">
           <li>{{ $errors->first('commission_percentage.*') }}</li>
        </ul>
    </div>
@endif
@if($errors->has('commission\u percentage.*))
  • {{$errors->first('commission_percentage.*')}
@恩迪夫
因此@nakov的上述回答启发了这个解决方案:

我正在使用
ajax
发布我的表单。要避免相同数组的值出现
+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' });
        }
然后连接到主
错误
字符串,如图所示:

<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">
errors = errors + commissionError;

就这样!现在,
commission\u percentage
下的所有必需属性都由一条验证错误消息表示。干净利落

如果您将所有错误消息分组在视图中的一个位置,您可以使用
unique
方法而不是
all
,例如:

public function messages()
{
    return [
        'commission_percentage.*' => 'Your field is required'
    ];
}
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->unique() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

非常感谢。我在下面发布了我的最终解决方案,但我不得不接受你的回答,因为它为我提出解决方案提供了基础