使用ModelNotFoundException

时间:2014-05-29 16:22:05

标签: laravel

我从Laravel开始,想要了解有关使用错误处理的更多信息,尤其是ModelNotFoundException对象。

<?php
 class MenuController extends BaseController {

    function f() {
          try {
                $menus = Menu::where('parent_id', '>', 100)->firstOrFail();
            } catch (ModelNotFoundException $e) {
                $message = 'Invalid parent_id.';
                return Redirect::to('error')->with('message', $message);
            }
        return $menus;
    }
  }
?>

在我的模特中:

<?php
 use Illuminate\Database\Eloquent\ModelNotFoundException;  

 class Menu extends Eloquent {
    protected $table = 'categories'; 
}

?>

当然,对于我的例子,“#”类别中没有记录。有parent_id > 100这是我的单元测试。所以我期待与ModelNotFoundException做点什么。

如果我在浏览器中运行http://example.co.uk/f,我会收到:

Illuminate \ Database \ Eloquent \ ModelNotFoundException
No query results for model [Menu].

laravel错误页面 - 这是预期的,但我如何重定向到我的路线&#39;错误&#39;使用预定义的消息?即。

<?php
// error.blade.php

{{ $message }}
?>

如果你能给我一个例子。

4 个答案:

答案 0 :(得分:13)

默认情况下,Laravelapp/start/global.php中声明了一个错误处理程序,如下所示:

App::error(function(Exception $exception, $code) {
    Log::error($exception);
});

如果没有声明其他特定处理程序,则此处理程序基本上捕获每个错误。要声明特定的(仅针对一种类型的错误),您可以在global.php文件中使用以下内容:

App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $exception) {

    // Log the error
    Log::error($exception);

    // Redirect to error route with any message
    return Redirect::to('error')->with('message', $exception->getMessage());
});

最好全局声明错误处理程序,这样您就不必在每个模型/控制器中处理错误处理程序。要声明任何特定的错误处理程序,请记住在它之后(默认错误处理程序)声明它,因为错误处理程序从大多数传播到特定错误处理程序。

详细了解Errors & Logging

答案 1 :(得分:8)

只需使用命名空间

try {
    $menus = Menu::where('parent_id', '>', 100)->firstOrFail();
}catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
    $message = 'Invalid parent_id.';
    return Redirect::to('error')->with('message', $message);
}

或者将其引用到带别名的外部名称

use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;

答案 2 :(得分:0)

尝试一下

  try {

      $user = User::findOrFail($request->input('user_id'));

    } catch (ModelNotFoundException $exception) {

       return back()->withError($exception->getMessage())->withInput();
    }

要显示错误,请在刀片文件中使用此代码。

 @if (session('error'))
   <div class="alert alert-danger">{{ session('error') }}</div>
 @endif

当然要使用控制器的顶部

use Illuminate\Database\Eloquent\ModelNotFoundException;  

答案 3 :(得分:0)

在Laravel 8.x和更高版本中使用render()函数时,将遇到500 Internal Server Error。这是因为使用Laravel 8.x会在register()函数中检查错误(请检查this link

我在这里留下一个工作示例:

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Throwable;

class Handler extends ExceptionHandler
{
    public function register()
    {

        $this->renderable(function (ModelNotFoundException $e, $request) {
            return response()->json(['status' => 'failed', 'message' => 'Model not found'], 404);
        });
        $this->renderable(function (NotFoundHttpException $e, $request) {
            return response()->json(['status' => 'failed', 'message' => 'Data not found'], 404);
        });
    }
}