我试图在Laravel中设置一个智能错误捕获系统,这样我就可以为每个错误定义一个视图,而不是传统的&#34;这里出了问题。&#34;调试关闭的消息。我已成功捕获典型的http标头,例如404,403,405和500,但是现在我想要捕获ModelNotFoundException并简单地返回404.这是我到目前为止所获得的:<\ n / p>
App::error(function(Exception $e, $code) {
$error = ['code' => $code];
switch($code) {
case 403:
return Response::view('errors.error', $error, $code);
break;
case 404:
return Response::view('errors.error', $error, $code);
break;
case 405:
return Response::view('errors.error', $error, $code);
break;
case 500:
return Response::view('errors.error', $error, $code);
break;
default:
return;
break;
}
/*
| Returns null if the error is not 401, 403, 404, 500, 405
| I just have a default of null in the switch on $code.
if(!in_array($code, [401, 403, 404, 500, 405])) {
return;
}
*/
});
App::error(function(ModelNotFoundException $e) {
return Response::view('errors.error', ['code' => 404], 404);
});
现在检测到403,404,405,500个标头工作正常但是当我添加另一个App ::错误来监听ModelNotFoundException时,全部都失败了。对于每个异常,我都返回null。默认情况下,ModelNotFoundException会抛出500个标头,这是我视图中显示的标头。我希望它是404。
TL; DR
答案 0 :(得分:12)
首先,您需要 views / errors 目录中的 404.blade.php 文件。
以下是发生ModelNotFoundException时抛出404错误的方法:
Laravel 4
在 app / start / global.php
App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $exception, $code)
{
return Response::view('errors.404', array(), 404);
});
Laravel 5.0&amp; 5.1 强>
将此代码添加到 /app/exceptions/handler.php 中的render()
方法:
if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
return response()->view('errors.404', array(), 404);
}
Laravel 5.2 +
发生ModelNotFound异常时会自动返回404错误。
答案 1 :(得分:3)
已解决 - 问题是命名空间。该例外的正确名称空间是:
\Illuminate\Database\Eloquent\ModelNotFoundException