Laravel。重定向到 post 方法

Laravel. Redirect intended to post method

我正在使用 laravel 5,这是我的问题。用户填写表单 X,如果他没有登录,他将被重定向以填写更多字段表单,或者他有可能登录。一切正常,如果用户填写其他字段,但如果他登录,laravel 使用 GET 方法而不是 POST.

将用户重定向到表单 X

这是我的中间件重定向的样子:

return redirect()->guest('user/additional-fields');

此重定向出现在成功登录时:

return redirect()->intended();

所以在重定向时我得到了错误 方法不允许的 HttpException。 URL 是正确的,定义为 POST 方法。我在这里错过了什么?为什么 laravel 重定向为 GET 方法?我该如何解决这个问题?谢谢!

编辑:

Route::post('/user/log-in-post', ['as' => 'user-log-in-post', 'uses' => 'UserController@postUserLogIn']);

这是我的路线,希望这是你需要的。

您必须通过传递“_method”输入来欺骗 Laravel 路由器。

我发现的最佳方法是添加欺骗和重写 Authenticate 中间件

您必须重写 handle 方法以允许使用新输入进行重定向。

redirect()->guest('your/path')->with('_method', session('url.entended.method', 'GET'));

当您想使用 GET 以外的其他方法重定向到路由时,只需执行 Session::flash('url.entended.method', 'YOUR_METHOD').

告诉我它是否有效

您可以使用命名路由来解决这个问题:

让我们像这样创建一个命名路由:

获取

Route::get('user/additional-fields',array(
    'uses' => 'UserController@getAdditionalFields',
    'as'   => 'user.getAdditionalFields'
));

对于post

Route::post('user/additional-fields',array(
    'uses' => 'UserController@postAdditionalFields',
    'as'   => 'user.postAdditionalFields'
));

所以我们现在可以通过这样做Laravel确保使用正确的路线

return redirect()->guest(route('user.getAdditionalFields'));

另请注意,无法重定向 POST,因为 Laravel 需要提交表单。所以你不能这样做:

return redirect()->guest(route('user.postAdditionalFields'));

除非你使用 cURL 或 GuzzleHttp 之类的东西来模拟 post 请求

Post方法路由形式控制器的非常简单的方法。

这背后的想法是,每个 Route 总是调用 ControllerAction 方法。这样在这种情况下,您可以直接调用该方法来代替执行的重定向操作。

检查 XYZController

的代码示例
 $registration =  Registration::find($req->regId);
 $registration->update([ 'STEP_COMPLETED' => 5]);  // Step 5 completed.

 # Call Post Method Route 
   return $this->admissionFinish($req);

Note that $req should have all parameter that required in next action Method.

更改app\exceptions\handler中的以下代码。php

use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;

protected function unauthenticated($request,AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }
    //return redirect()->guest(route('login'));
    return redirect()->guest('http://127.0.0.1:8000/api/signinnew'); // change this part to your login router
}

在路线中(即api.php):

Route::Any('signinnew',          [UserLogonController::class, 'signinNew']);

这将适用于 laravel 8x