我使用laravel 5,这是我的问题。用户填写表单X,如果他没有登录,他会被重定向以填写更多字段或者他有可能登录。一切正常,如果用户填写其他字段,但如果他登录, laravel使用GET方法而不是POST将用户重定向到表单X.
这是我的中间件重定向的样子:
return redirect()->guest('user/additional-fields');
此重定向在成功登录时显示:
return redirect()->intended();
所以在重定向意图我得到错误 MethodNotAllowedHttpException。 URL正确,定义为POST方法。我在这里错过了什么?为什么laravel重定向作为GET方法?我怎么能解决这个问题?谢谢!
修改
Route::post('/user/log-in-post', ['as' => 'user-log-in-post', 'uses' => 'UserController@postUserLogIn']);
这是我的路线,我希望这是你需要的。
答案 0 :(得分:5)
您可以使用命名路由来解决此问题:
让我们像这样建立一条命名路线:
获取
Route::get('user/additional-fields',array(
'uses' => 'UserController@getAdditionalFields',
'as' => 'user.getAdditionalFields'
));
发布
Route::post('user/additional-fields',array(
'uses' => 'UserController@postAdditionalFields',
'as' => 'user.postAdditionalFields'
));
所以我们现在可以通过这样做确保Laravel使用正确的路线
return redirect()->guest(route('user.getAdditionalFields'));
另请注意,由于Laravel希望提交表单,因此无法重定向POST
。所以你不能这样做:
return redirect()->guest(route('user.postAdditionalFields'));
除了你使用像cURL或GuzzleHttp这样的东西来模拟一个帖子请求
答案 1 :(得分:2)
你必须通过传递" _方法"来欺骗Laravel路由器。输入。
我发现的最好方法是添加欺骗并重写Authenticate中间件
您必须重写handle方法以允许使用新输入进行重定向。
redirect()->guest('your/path')->with('_method', session('url.entended.method', 'GET'));
如果您想使用除GET之外的其他方法重定向到路线,只需执行Session::flash('url.entended.method', 'YOUR_METHOD')
。
告诉我它是否有诀窍
答案 2 :(得分:1)
一种非常简单的方法,用于发布方法 路线,形成控制器。
其背后的想法是,每个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);
请注意, $ req 应具有下一步中要求的所有参数 动作方法。
答案 3 :(得分:1)
更改 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