Пользовательские сообщения об ошибках для элементов формы html с именами массивов в Laravel

У меня возникли проблемы с отображением в моей форме сообщений об ошибках проверки настраиваемых полей perr. Я был бы очень признателен за помощь в решении этой проблемы.

Я много использовал проверки Laravel и поэтому понимаю принципы, но проблема, с которой у меня сейчас проблема, заключается в отображении пользовательского сообщения для элемента html с именем, которое является массивом.

У меня есть «наборы» полей, которые реплицируются по нажатию кнопки. Каждый набор создается с использованием возрастающего значения индекса, которое отличает один набор от другого:

<div id="divSet1">
    <input type='text' 
        class="form-control @error('form_fields[1][surname]') is-invalid @enderror" 
        id="form_fields_1_surname" name="form_fields[1][surname]" />
    @error('form_fields[1][surname]')
        <div class="alert alert-danger">{{ $message }}</div>
    @enderror
    
    .
    .
    . more fields here
    .
    .

</div>

<div id="divSet2">
    <input type='text' 
        class="form-control @error('form_fields[2][surname]') is-invalid @enderror" 
        id="form_fields
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;


/**
 * Application form request
 * 
 * @category controllers 
 * @sub-category validation
 */
class FormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'form_fields.*.surname' => 'required',
        ];
    }

    /**
     * Get the error messages for the defined validation rules
     * 
     * @return array
     */
    public function messages()
    {
        return [
            'form_fields.*.surname.required' => 'Please supply a surname',
        ];
    }

}
surname" name="form_fields[2][surname]" /> @error('form_fields[2][surname]') <div class="alert alert-danger">{{ $message }}</div> @enderror . . . more fields here . . </div>

Класс FormRequest:

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;


/**
 * Application form request
 * 
 * @category controllers 
 * @sub-category validation
 */
class FormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'form_fields.*.surname' => 'required',
        ];
    }

    /**
     * Get the error messages for the defined validation rules
     * 
     * @return array
     */
    public function messages()
    {
        return [
            'form_fields.*.surname.required' => 'Please supply a surname',
        ];
    }

}

Когда я отправляю форму, я не вижу настраиваемых сообщений об ошибках для ошибочных полей фамилии. Поля даже не выделены красным.

Однако, если я добавлю общий баннер сообщения об ошибке проверки, указанный в документации Laravel (https://laravel.com/docs/6.x/validation#quick-displaying-the-validation-errors), сообщается об отсутствующих фамилиях:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

Хотя это работает и действительно сообщает об отсутствующих фамилиях в верхней части страницы без пользовательских сообщений:

* Please supply a surname  // <-- form_fields[1][surname]
* Please supply a surname  // <-- form_fields[2][surname]

.. это не индивидуальные пользовательские ошибки, отображаемые под недопустимыми полями.

Любая помощь в решении этой проблемы будет оценена по достоинству. Заранее спасибо.


person quinny    schedule 28.06.2020    source источник


Ответы (1)


Вы можете сделать это как

@error('form_fields.2.surname')
 <div class="alert alert-danger">{{ $message }}</div>
@enderror
person zeref    schedule 29.06.2020
comment
Спасибо @zeref, это решило это для меня. Может быть, это следует добавить в документацию Laravel? - person quinny; 30.06.2020