Моя проблема в том, что мой POST-запрос всегда перенаправляется в GET после ошибки 302
Вот мой файл маршрутов:
Route::auth();
...
Route::post('/personnalite/creer', 'PersonnaliteController@creerPost')->name('personnaliteCreerPost');
Route::get('/personnalite/creer', 'PersonnaliteController@creerGet')->name('personnaliteCreerGet');
...
Когда я удаляю получение маршрута перед публикацией, маршрутизация Laravel завершается ошибкой.
Я могу увидеть запрос на публикацию перед перенаправлением в моем инструменте для разработки веб-приложений
Вот мое промежуточное программное обеспечение, которое зарегистрировано в «сетевых» middelwareGroups.
Он просто проверяет, что маршрут разрешен для роли пользователя (правила ACL зарегистрированы в файле конфигурации)
class MyAclMiddleware {
public function handle($request, Closure $next) {
$myAcl = App::offsetExists('MyAcl') ? App::make('MyAcl') : null;
if($myAcl) {
if(Auth::guest()) {
$myAcl->setRole(0);
} else {
$myAcl->setRole(Auth::user()->role);
}
if($myAcl->isNotAllowed('route.' . Route::getRoutes()->match($request)->getName())) {
return redirect()->route('erreur', ['id' => 0]);
}
}
return $next($request);
}
}
Вот мой шаблон лезвия формы:
@extends('layouts.app')
@section('content')
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">Créer une personnalité politique</div>
<div class="panel-body">
{{ @Form::open(['route' => 'personnaliteCreerPost', 'files' => true]) }}
@include('personnalite.subviews.formInfosGenerales')
{{ Form::submit('Créer') }}
{{ @Form::close() }}
@include('personnalite.subviews.listePersonnalites')
</div>
</div>
</div>
</div>
@enduction
Другие готовые формы и контроллеры laravel для входа в систему … работают нормально.
Кто-нибудь может помочь мне решить эту проблему?
Решено!
Проблема была из-за неправильной логики проверки формы в моем контроллере (недостаточный тест => отсутствие проверки формы => перенаправление на предыдущую форму)
Мне стыдно
Это может быть полезно для других пользователей, которые имеют ту же проблему, но не могут решить ее с помощью решения выше:
Убедитесь, что имена полей формы, например, <input type="text" name="document_name">
(название документа), сопоставьте имена полей правил, объявленных в модели.
public static $rules = ['document_name' => 'required|string'];
Он не выдает никаких ошибок, ничего в журналах, он просто перенаправляет на форму, поэтому трудно найти проблему.
Для меня это была проблема, совпадающая с вашей причиной «плохой логики проверки правильности формы».
Переадресация 302 является ошибкой проверки по умолчанию Laravel (не-ajax). Вы можете получить некоторый контроль над этим, сделав это так:
$validator = Validator::make($request->all(), [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'required|email',
]);
if ($validator->fails()) {
$errors = $validator->errors();
return redirect()->back()->withErrors($errors)->withInput();
}
Улавливая ошибку и затем перенаправляя ее вручную, вы можете быть уверены в том, что возвращается на вашу страницу. Кроме того, эти ошибки не будут отображаться на вашей странице, если у вас нет кода для их отображения — они хранятся в переменной сеанса. Так что может показаться, что вы просто возвращаетесь на страницу каким-то странным круговым маршрутом, хотя на самом деле есть ошибки, которые нужно отобразить. Множественное число с ошибками подходит для серии ошибок проверки и может отображаться в соответствующем поле в шаблоне блейда следующим образом:
@if ($errors->has('first_name'))
<span class="text-danger">{!! $errors->first('first_name') !!}</span>
@endif
Тогда у вас есть в верхней части вашей страницы, что-то вроде этого:
@if (session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
Какие ловить пользовательские сообщения об ошибках, отправленные с вашего контроллера, как:
return redirect()->back()->withSuccess('Profile updated');
или же
return redirect()->back()->with("error","New Password does not match the password confirmation field. Please make sure they are the same.");
Обратите внимание на разницу в одну букву между «ошибками» и «ошибками». Это может сбить вас с толку, если вы сделаете опечатку.
И чтобы быть полным, статус 422 — это то, что вы получаете после сбоя проверки посредством вызова Ajax на ваш контроллер. Laravel так много делает для тебя!