Laravel 路由隐式绑定返回 500 而不是 404

问题描述 投票:0回答:1

所以我的 Laravel 10 应用程序中有一条如下所示的路线:

Route::get('user/{user}', [UserController::class, 'getProfile']);

我在 Laravel 的文档中读到,如果找不到给定的用户,它应该返回 404 错误:

如果在数据库中未找到匹配的模型实例,将自动生成 404 HTTP 响应。

但在我的应用程序中,我收到了 500 错误......我处理这条路线的控制器非常基本:

public function getProfile(User $user): View
{
    return view('user.profile', ['user' => $user]);
}

知道问题出在哪里吗?我真的不知道该去哪里看...

php laravel routes http-status-code-404 http-status-code-500
1个回答
0
投票

好吧,我明白了...这是由于我一年多前在

App\Exceptions\Handler
课程中所做的改变。

基本上默认情况下,Laravel 确实会为所有

ModelNotFoundException
异常抛出 404。

在此文件中,Laravel 将

ModelNotFoundException
s 注册为
NotFoundHttpException
s,这会返回 404。

我一年前遇到的问题是我不希望所有

ModelNotFoundException
返回 404,因为有时在未找到错误模型时会导致错误的 404(某些请求要求我找到多个模型,例如主模型的子模型,如果找不到相关的主模型,我只想要 404)。

所以我编辑了我的

App\Exceptions\Handler
以包含以下内容:

protected function shouldntReport(Throwable $e): bool
    {
        $shouldntReport = parent::shouldntReport($e);

        return $e instanceof ModelNotFoundException ? false : $shouldntReport;
    }

    protected function prepareException(Throwable $e): Throwable
    {
        if ($e instanceof ModelNotFoundException) {
            return $e;
        }

        return parent::prepareException($e);
    }

现在的结果是当出现

ModelNotFoundException
时,如果不处理就会返回500错误。并且它会被记录下来。这就是我想要更好地控制我的应用程序的目的。

所以,如果我不想使用 Laravel 的默认功能,在这种情况下我能想到的唯一解决方案是如果我担心发生 500 个错误,则不要使用隐式绑定。相反,我应该将问题中的路线更改为:

Route::get('user/{id}', [UserController::class, 'getProfile']);

和我的控制器:

public function getProfile(string $id): View
{
    $user = User::find($id);
    if (!$user) {
        abort(404);
    }

    return view('user.profile', ['user' => $user]);
}
© www.soinside.com 2019 - 2024. All rights reserved.