Проверка формы Laravel перенаправляет обратно на домашнюю страницу при ошибках формы, а не остается на той же странице - PullRequest
0 голосов
/ 19 мая 2019

У меня есть контактная форма, которая при отправке успешно отправляется в БД.Проблема заключается в том, что, когда я проверяю проверку на моей веб-странице, ошибки правильно отображаются с помощью проверки ошибок Larvael $, проблема в том, что моя веб-страница всегда перенаправляется обратно на домашнюю страницу, когда ошибки появляются вместо того, чтобы страница оставалась неподвижной и показывала ошибки.Я должен продолжать прокручивать страницу, где находится моя контактная форма, чтобы увидеть ошибки;это будет раздражать моих будущих пользователей.Как мне заставить страницу оставаться там, где она есть, если есть ошибки?ПРИМЕЧАНИЕ. Моя страница перенаправляется правильно, когда форма действительна и отправлена, это не проблема.ПРИМЕЧАНИЕ-2: Я создал одностраничную веб-страницу, по которой можно перейти по навигационным ссылкам. Перенаправлений нет.Вместо этого это одна HTML-страница.

Web.php

Route::get('/', 'HomeController@index')->name('home');
Route::post('/contact/submit', 'MessagesController@submit');

MessagesController.php

namespace App\Http\Controllers;

use App\Message;
use Illuminate\Http\Request;

class MessagesController extends Controller
{
    public function submit(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|min:2',
            'email' => 'required|max:255',
            'phonenumber' => 'required|min:10|max:10',
            'message' => 'required|min:5',
        ]);

        Message::create($validatedData);

        return redirect('/')->with('success', 'Your message has been 
            successfully sent. We will reach out to you soon');
    }
}

contact.blade.php

{{--CONTACT FORM--}}
<section id="contact">
    <div class="container-fluid padding">
        <div class="row text-center padding">
            <div class="col-12">
                <h2 class="lead display-3">Contact Us</h2>
                <hr class="my-4">

                <form action="/contact/submit" method="POST">
                    @csrf
                    <div class="field">
                        <label for="name" class="label">Name</label>

                        <div class="control">
                            <input type="text" class="input {{$errors->has('name') ? 'is-danger' : 'is-success'}}"
                                   name="name" placeholder="Project Title" value="{{old('name')}}">
                        </div>
                    </div>

                    <div class="field">
                        <label for="name" class="label">Email</label>

                        <div class="control">
                            <input type="text" class="input {{$errors->has('email') ? 'is-danger' : 'is-success'}}"
                                   name="email" placeholder="Project Title" value="{{old('email')}}">
                        </div>
                    </div>

                    <div class="field">
                        <label for="name" class="label">Phone Number</label>

                        <div class="control">
                            <input type="text"
                                   class="input {{$errors->has('phonenumber') ? 'is-danger' : 'is-success'}}"
                                   name="phonenumber" placeholder="Project Title" value="{{old('phonenumber')}}">
                        </div>
                    </div>

                    <div class="field">
                        <label for="message" class="label">Message</label>
                        <div class="control">
                            <textarea name="message"
                                      class="textarea {{$errors->has('message') ? 'is-danger' : 'is-success'}}"
                                      placeholder="Project description">{{old('message')}}</textarea>
                        </div>
                    </div>

                    <div class="field">
                        <div class="control">
                            <button type="submit" class="button is-link">Create Project</button>
                        </div>
                    </div>

                    <!--Errors variable used from form validation -->
                    @if($errors->any())
                        <div class="notification is-danger">
                            <ul>
                                @foreach($errors->all() as $error)
                                    <li>{{$error}}</li>
                                @endforeach
                            </ul>
                        </div>
                    @endif
                </form>
            </div>
        </div>
    </div>
</section>

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Вам необходимо создать ручной валидатор, чтобы иметь возможность контролировать перенаправление в случае сбоя валидации (что, как я полагаю, вызывает у вас проблемы).

public function submit(Request $request)
    {
        $validator = Validator::make($request->all(),[
            'name' => 'required|min:2',
            'email' => 'required|max:255',
            'phonenumber' => 'required|min:10|max:10',
            'message' => 'required|min:5',
        ]);

        if ($validator->fails()) {
            return redirect(url()->previous() .'#contact')
                    ->withErrors($validator)
                    ->withInput();
        }

        Message::create($request->all());

        return redirect('/')->with('success', 'Your message has been 
            successfully sent. We will reach out to you soon');
    }
2 голосов
/ 19 мая 2019

Сначала переместите ошибки в верхнюю часть формы, чтобы вы могли их видеть.

<form action="/contact/submit" method="POST">
    @csrf
    @if($errors->any())
        <div class="notification is-danger">
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{$error}}</li>
                @endforeach
            </ul>
        </div>
    @endif

Лучший способ обработки проверки состоит в том, чтобы отделить ее с помощью запроса формы.

php artisan make:request SendMessageRequest
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SendMessageRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|min:2',
            'email' => 'required|max:255',
            'phonenumber' => 'required|min:10|max:10',
            'message' => 'required|min:5',
        ];
    }
}

Если проверка не пройдена, будет автоматически сгенерирован ответ на перенаправление, чтобы отправить пользователя обратно на прежнее место.

Теперь обновите ваш контроллер.

namespace App\Http\Controllers;

use App\Http\Requests\SendMessageRequest;
use App\Message;

class MessagesController extends Controller
{
    public function submit(SendMessageRequest $request)
    {
        Message::create($request->validated());

        return redirect('/')->with('success', 'Your message has been
            successfully sent. We will reach out to you soon');
    }
}

Или вы можете оставить проверку в вашем контроллере, используя перенаправление Validator и back(), но первый способ - лучший.

public function submit(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|min:2',
        'email' => 'required|max:255',
        'phonenumber' => 'required|min:10|max:10',
        'message' => 'required|min:5',
    ]);

    if ($validator->fails()) {
        return back()->withInput()->withErrors($validator);
    }

    Message::create($request->all());

    return redirect('/')->with('success', 'Your message has been
        successfully sent. We will reach out to you soon');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...