所以我的 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]);
}
知道问题出在哪里吗?我真的不知道该去哪里看...
好吧,我明白了...这是由于我一年多前在
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]);
}