Laravel。旨在发布方法的重定向

时间:2015-05-26 15:49:01

标签: php redirect laravel-5 url-redirection middleware

我使用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']);

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

4 个答案:

答案 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