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

时间:2019-06-29 14:47:49

标签: 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" name="client_type[]" class="form-control" value="Non Panelist" readonly>
<input type="number" name="commission_percentage[]" class="form-control">

为了验证commission_percentage字段,我们将在表单请求类中进行此操作:

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次,我们将输出一条验证错误消息,并表示其中的所有项目。相同的数组?

谢谢。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

因此@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' });
        }

因此,我定义了commissionError变量,按照表单请求规则中的定义检查了commission_percentage键的存在,捕获了匹配的值并将其显示在循环外,如下所示:< / p>

commissionError = '<li>' + commissionError + '</li>';

然后连接到主errors字符串,如下所示:

errors = errors + commissionError;

就是这样!现在,commission_percentage下的所有必需属性都由一条验证错误消息表示。干净!

答案 2 :(得分:0)

如果您将所有错误消息归类在一个视图中,则可以使用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'
    ];
}