Laravel 5.2 Post 302重定向到GET

时间:2016-05-18 22:48:05

标签: php redirect laravel-5 routing http-status-code-302

我的问题是我的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表格和登录控制器......工作正常。

有人可以帮我解决这个问题吗?

3 个答案:

答案 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为您做了很多!