Разделить ошибки запроса Laravel на разделы - PullRequest
0 голосов
/ 04 июля 2018

Я хочу иметь возможность разбить мои сообщения об ошибках Laravel на разделы.

Допустим, у меня есть страница страхового полиса, которая имеет 3 раздела

Подробности драйвера

Сведения об автомобиле

Подробности политики

Я использую запрос laravel, как этот

'driver_name' => 'required',
'address_line_1' => 'required',
'address_line_2' => 'required',
'address_line_3' => 'required',
'postcode' => 'required',

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

В запросе, как мне отправить его обратно с тегом раздела вроде

'имя_драйвера' => 'обязательно | раздел: driverDetails'

Чтобы разделить ошибки?

Если сообщения об ошибках laravel не могут быть помечены, каков наилучший способ для этого?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете использовать Vue.js и axios для проверки и отображения ошибок. Иметь маршрут / validate-data в контроллере для проверки данных.

файл app.js:

       import Vue           from 'vue'
        window.Vue = require('vue');
        window.axios = require('axios');

        window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

        let token = document.head.querySelector('meta[name="csrf-token"]');

        if (token) {
            window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
        } else {
            console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
        }

             class Errors {
                constructor() {
                    this.errors = {};
                }

                get(field) {
                    if (this.errors[field]) {

                        return this.errors[field][0];
                    }
                }

                record(errors) {
                    this.errors = errors;
                }

                clear(field) {
                    delete this.errors[field];
                }

                has(field) {
                    return this.errors.hasOwnProperty(field);
                }

                any() {
                    return Object.keys(this.errors).length > 0;
                }
            }

            new Vue({
             el: '#app',

                data:{
               errors: new Errors(),
              model: {
    driver_name: '',
    address_line1: '',
    address_line2: ''
    },
            },

        methods: {
          onComplete: function(){
              axios.post('/validate-data', this.$data.model)
                  // .then(this.onSuccess)
                  .catch(error => this.errors.record(error.response.data.errors));
           },
}
        });

Создать маршрут / validate-data с помощью метода в контроллере, выполнить стандартную проверку

$this->validate(request(), [
'driver_name' => 'required',
'address_line_1' => 'required',
'address_line_2' => 'required',
'address_line_3' => 'required',
'postcode' => 'required'
]

Затем создайте свои входные данные в файле представления, используя v-модель, которая соответствует полям модели данных vue.js. Под ним добавьте диапазон с классом ошибок (например, базовым стилем красной ошибки), который отображается только при наличии ошибок. Например:

<input type="text" name="driver_name" v-model="model.driver_name" class="input">
<span class="error-text" v-if="errors.has('driver_name')" v-text="errors.get('driver_name')"></span>

Не забудьте включить файл app.js в нижний колонтитул вашего файла представления. Не забудьте включить тег и запустить npm run watch, чтобы скомпилировать код vue. Это позволит вам проверить все ошибки под их полями ввода.

Забыл добавить, есть кнопка с @ onclick = "onComplete" для запуска метода validate.

0 голосов
/ 04 июля 2018

Вы можете получить $ ошибок для каждого правила проверки Итак, если у вас есть следующее правило:

'имя_драйвера' => 'обязательно',

Вы можете просто вывести ошибку поверх поля driver_name в своем блейде

@if ($errors->has('driver_name'))
    <div class="error">{{ $errors->first('driver_name') }}</div>
@endif
<input type="text" name="driver_name">

Вы можете обратиться к документации здесь

...