Laravel:如何防止在RouteCollection.php中出现MethodNotAllowedHttpException异常,当有人访问一个post-route而没有给出post参数时?

55ooxyrt  于 2023-01-14  发布在  PHP
关注(0)|答案(6)|浏览(143)

Laravel:如何防止在RouteCollection.php中出现MethodNotAllowedHttpException异常,当有人访问一个post-route而没有给出post参数时?
当我定义了一个发布路由,它只能被一个发布请求访问。如果我在浏览器中正常调用url,它会抛出一个异常。如何防止这个?

dojqjjoe

dojqjjoe1#

任何人都可以使用不允许的方法请求您的任何路由。您可以在resources/views/errors文件夹中查看异常。默认情况下,Laravel附带一个HTTP状态代码503(服务不可用错误)的错误页面。
MethodNotAllowedHttpException的HTTP状态代码是405,因此创建一个名为405.blade.php的视图将导致Laravel显示该视图,而不是MethodNotAllowedHttpException消息。

ovfsdjhp

ovfsdjhp2#

这应该做的工作,这将捕捉所有的错误,如,方法不允许或404(页面未找到)或模型未找到或令牌错过匹配,并重定向到任何路由,你想要与适当的错误!

Handler.php

    public function render($request, Exception $e){
       if ($e instanceof ForbiddenException) {
            return redirect()->route('name')->withErrors(['error' => $e->getMessage()]);
       }
       return parent::render($request, $e);
    }

或仅用于不允许的方法

use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
    if ($e instanceof MethodNotAllowedHttpException) {
        return redirect()->route('name')->withErrors(['error' => $e->getMessage()]);
    }
wtzytmuj

wtzytmuj3#

使用Route::any()Route::match()
示例:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('foo', function () {
    //
});
dgsult0t

dgsult0t4#

我尝试了比赛和任何方法,但它们都不是我所需要的。
我是这么做的:
1-在Base控制器中添加默认的错误处理程序。2-手动调用每个禁止的HTTP方法的错误。

然后,在BaseController上:

py49o6xq

py49o6xq5#

添加一个文件“405.blade.php”到你的“资源/视图/错误”中会阻止MethodNotAllowedHttpException页面再次出现。

rm5edbpk

rm5edbpk6#

对于laravel 9,我是这样解决的,你可以改变要捕捉的异常,一定要把它包含在顶部:

use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;

以及:

Handler.php

/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */
public function register()
{
    $this->reportable(function (Throwable $e) {
        //
    });

    $this->renderable(function (MethodNotAllowedHttpException $e, $request) {
            return abort(404, "page not found");
    });
}

相关问题