繁体   English   中英

如果用户在URL Laravel中键入POST路由,则中间件将重定向用户

[英]Middleware to redirect users if they type POST route in URL Laravel

截至目前,当我的用户在URL中键入POST路由时,它显示一条错误,指出The GET method is not supported for this route. Supported methods: POST. The GET method is not supported for this route. Supported methods: POST. 我想编写一个中间件,如果用户尝试使用任何POST路由,它将重定向用户。 我尝试执行以下操作:

我创建了一个RedirectIfPOST中间件。 这是代码:

<?php

namespace App\Http\Middleware;

use Closure;

class RedirectIfPOST
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        // Redirect if user tries accessing a POST route.

        return redirect('/');
    }
}

在我的Kernel.php我向$routeMiddleware数组添加了以下代码行:

'post' => \App\Http\Middleware\RedirectIfPOST::class,

最后,在我的web.php我将所有POST路由分组到了中间件中,如下所示:

Route::group( ['middleware' => 'post'],function()
{

    Route::post('/signup', 'MainController@signup');

    Route::post('/login', 'MainController@authenticate');

    Route::post('/activate','ActiveController@activate');

});

如何解决此问题,以便将用户重定向到主页而不看到错误?

编辑

正如Sherif Tarek所建议的,我做了以下工作:

我已经复制了我的POST路由,并将重复的路由GET 然后,我在中间件内部将GET路由分组。 所以现在我的web.php看起来像这样:

Route::post('/signup', 'MainController@signup');

Route::post('/login', 'MainController@authenticate');

Route::post('/activate','ActiveController@activate');



Route::group( ['middleware' => 'post'],function()
{

    Route::get('/signup', 'MainController@signup');

    Route::get('/login', 'MainController@authenticate');

    Route::get('/activate','ActiveController@activate');

});

这样,如果用户尝试通过URL访问POST路由,我会将其重定向到主页。

在这种情况下,在执行请求分配管道之前抛出了异常,因此,您的中间件功能将不会被执行。 无需使用中间件,您可以处理异常以归档目标

public function render($request, Exception $exception)
{
   if($exception instanceof MethodNotAllowedHttpException && $request->isMethod('POST')){
       return redirect('/');
   }
   return parent::render($request, $exception);
}

我已将以上代码添加到laravel App\\Exceptions\\Handler.php文件中

问题在于Route是在中间件之前检查的,因为您可以在中间件中调用路由功能。 解决您的问题的一种可能方法是复制路由,但将方法更改为GET ,然后将中间件分配给它们,或者,如果您选择这种方式,则可以请求重定向到所需的任何内容,我认为拥有RedirectController将集中重定向路径,或者如果您想拥有逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM