【问题标题】:Laravel. Redirect intended to post method拉拉维尔。重定向意在发布方法
【发布时间】:2015-05-26 15:49:00
【问题描述】:

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

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

【问题讨论】:

  • 最好在让用户访问您的页面之前检查用户是否已登录,而不是在发布数据时检查他是否已登录。实际上,您确实会检查用户是否已登录/是否有权发布您的数据,但如果他没有。您必须引发异常并重定向到相应的错误页面。
  • 这背后的想法是让用户写帖子,如果他想避免注册,让他登录,如果他决定用现有帐户写当前帖子。
  • 嗯...好的,我明白了。在重定向后重新访问控制器时,您可能会使用 Input 门面的 old() 方法。输入::old()
  • 但是我如何重定向回查看而不是发布方法?
  • 请让我看看你的用户路由,你可以使用命名路由解决这个问题

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


【解决方案1】:

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

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

获取

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'));

还要注意,它不可能重定向 POST,因为 Laravel 需要提交表单。所以你不能这样做:

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

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

【讨论】:

  • 嗯,我理解这背后的理念,但问题是重定向到 post 方法发生在成功登录时。这是我登录后的重定向:return redirect()->intended();我如何定义这个重定向?
  • 好吧,也许它可能是面团。这就是 Laravel 中重定向方法的样子。 function redirect($to = null, $status = 302, $headers = array(), $secure = null) { if (is_null($to)) return app('redirect'); return app('redirect')->to($to, $status, $headers, $secure); }lemme 看看这是否可以通过 $headers 完成
  • @Evaldus Butkus 请您也将一些表单数据发送到redirect()->guest('user/additional-fields');
  • 是的,我愿意。 return redirect()->guest('user/review/information/' .$code);因此,据我所知,我需要了解 post 方法发生的那个视图。
  • 嗯。你能让请求流程更清晰吗?我明白 1. 你这样做return redirect()->guest('user/additional-fields'); 2. 从用户/附加字段控制器方法你现在return redirect()->intended(); 请问return redirect()->guest('user/review/information/' .$code); 在哪里适合这个流程?
【解决方案2】:

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

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

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

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

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

告诉我它是否有效

【讨论】:

  • return redirect()->guest('oams/admission-finish')->withInput([ 'sid'=>$req->sid,'regId'=>$req->regId ]) ->with(['_method'=> session('url.entended.method', 'POST')]);
【解决方案3】:

Post 方法 Route 表单Controller 的非常简单的方法。

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

检查 XYZController

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

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

请注意,$req 应该包含接下来需要的所有参数 动作方法。

【讨论】:

    【解决方案4】:

    在 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 中工作

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多