Home Articles

如何为ModelNotFoundException laravel显示404

Asked
Viewed 181 times
2

我正在尝试在Laravel中设置一个智能错误捕获系统,这样我就可以为每个错误定义一个视图,而不是传统的“这里出了问题” . 调试关闭的消息 . 我已成功捕获典型的http标头,例如404,403,405和500但是现在我想要捕获ModelNotFoundException并简单地返回404.这是我到目前为止所得到的:

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

  • 我希望ModelNotFoundException抛出404而不是500 .

2 Answers

  • 11

    首先,您需要在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 & 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错误 .

  • 2

    已解决 - 问题是命名空间 . 该异常的正确名称空间是:

    \Illuminate\Database\Eloquent\ModelNotFoundException
    

Related