我的问题是我的POST请求总是在错误302后重定向到GET
这是我的路线档案:
Route::auth();
...
Route::post('/personnalite/creer', 'PersonnaliteController@creerPost')->name('personnaliteCreerPost');
Route::get('/personnalite/creer', 'PersonnaliteController@creerGet')->name('personnaliteCreerGet');
...
当我删除get route befort发布时,laravel路由失败。 我可以在我的web brouter开发工具中重定向之前看到发布请求
这是我的middelware,它在'web'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表格和登录控制器......工作正常。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
已解决!
问题是由于我的控制器中的错误表单验证逻辑(测试不足=&gt;没有表单验证=&gt;重定向到以前的表单)
羞辱我
答案 1 :(得分:0)
对于具有相同问题的其他用户而言,这可能对上述解决方案无法解决:
确保实例<input type="text" name="document_name">
(document_name)的表单字段名称与模型中声明的规则字段的名称相匹配。
public static $rules = ['document_name' => 'required|string'];
它不会抛出任何错误,日志中没有任何错误,它只是重定向到表单,因此难以找到问题。
对我而言,这就是问题所在,与你的理由相吻合&#34;糟糕的表单验证逻辑&#34;。
答案 2 :(得分:0)
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();
}
通过捕获故障,然后手动重定向,可以确定返回页面的内容。另外,除非您有一些代码可以显示这些错误,否则它们不会显示在您的页面上-它们保存在会话变量中。因此,看起来您只是以某种奇怪的循环路线返回页面,而实际上却要显示错误。复数,withErrors,适用于一系列验证错误,可以显示在刀片模板的适当字段下,如下所示:
@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为您做了很多!