Laravel - не продолжать после проверки формы, если запрос ajax

user1985273 спросил: 13 октября 2017 в 06:39 в: javascript

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

Для этого я добавил функцию javascript в форму отправки:

<form id="x" onsubmit="return dosubmit(this)" action="{{ url('/x') }}" method="POST"><script>
    function dosubmit(form) {
        $.ajax({
            url: $(form).attr('action'),
            type: 'post',
            data: $(form).serializeArray()
        }).done(function (data) {
            form.submit();
        }).fail(function (data) {
            alert('error');
        });
        return false;
    }
</script>

И у меня есть собственный запрос на проверку формы:

class X extends FormRequest
{
    public function authorize()
    {
        return true;
    }    public function rules()
    {
        return [
            'name' => 'required',
        ];
    }
}

Когда мой ajax-запрос не выполняется, все работает нормально. Мой валидатор формы возвращает ошибку в json, и я могу показать ее пользователю. Проблема в том, что когда он успешен, он фактически отправляет данные два раза - первый раз из запроса ajax и второй раз, потому что я вызываю form.submit () после успешного выполнения запроса ajax. Поскольку я хочу перенаправить пользователя после отправки, я бы на самом деле хотел, чтобы только вторая отправка достигла контроллера. Это означает, что я должен остановить запрос AJAX после проверки. Мой текущий обходной путь заключается в том, что у меня есть строка, подобная этой, в моем контроллере:

public function store(X $request)
{
    if ($request->ajax()) {
        return;
    }    // only actual request reaches here
}

Это работает, но это не красиво. Мне не нравится включать эту строку в мой контроллер. Я был бы счастлив, если бы я мог сделать что-то подобное в моем валидаторе запроса, но я не могу найти хороший способ вернуться после проверки оттуда. Есть идеи, как мне это сделать?

0 ответов