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 总是调用 Controller 的 Action 方法。这样在这种情况下,您可以直接调用该方法来代替执行的重定向操作。
检查 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
我正在使用 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 总是调用 Controller 的 Action 方法。这样在这种情况下,您可以直接调用该方法来代替执行的重定向操作。
检查 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