Laravel 5.2:将Post请求重定向到GET请求的302状态码

4
我的问题是,我的POST请求在错误302后总是重定向到GET。这是我的路由文件:
Route::auth();
...
Route::post('/personnalite/creer', 'PersonnaliteController@creerPost')->name('personnaliteCreerPost');
Route::get('/personnalite/creer', 'PersonnaliteController@creerGet')->name('personnaliteCreerGet');
...

当我在发布之前删除get路由时,Laravel路由失败。 我可以在我的Web浏览器开发工具中看到重定向前的POST请求。
这是我的中间件,它在“web”中间件组中注册。 它只是检查路由是否允许用户角色(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);
    }
}

以下是我的表单Blade模板:

@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 表单和控制器可用于登录...运行良好。

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


如果您在createPost方法中放置die('here');,它是否会显示? - Brett
还可以尝试在Form :: open调用中明确指定参数,将'method' => 'post'放入其中,看看是否会有任何变化。 - Brett
对于那些最近升级了 Laravel 的人,请检查您控制器中的中间件语法。很可能需要更新。 - Marcel Gruber
3个回答

2

问题已解决!

这个问题是由于我的控制器中存在错误的表单验证逻辑所致(测试不足 => 没有表单验证 => 重定向到之前的表单)

我真是太丢人了。


2
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适用于一系列验证错误,并且可以在blade模板的相应字段下显示,如下所示:

@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.");

注意“errors”和“error”之间只有一个字母的区别。如果您打错了字,这可能会导致错误。
完整来说,通过ajax调用控制器进行验证失败返回的状态码为422。Laravel已经帮助你完成这么多工作!

0
这可能对其他遇到同样问题的用户有用,无法通过上面的解决方案解决它:
确保表单字段的名称,例如<input type="text" name="document_name"> (document_name),与模型中声明的规则字段的名称匹配。
public static $rules = ['document_name' => 'required|string'];
它不会抛出任何错误,日志中也没有任何信息,只会重定向到表单,因此很难找到问题。
对我来说,那就是问题所在,与你的原因“糟糕的表单验证逻辑”相吻合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接