使用ModelNotFoundException

coo*_*kie 14 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;
    }
  }
?>
Run Code Online (Sandbox Code Playgroud)

在我的模型中:

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

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

?>
Run Code Online (Sandbox Code Playgroud)

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

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

Illuminate \ Database \ Eloquent \ ModelNotFoundException
No query results for model [Menu].
Run Code Online (Sandbox Code Playgroud)

laravel错误页面 - 这是预期的,但如何使用预定义的消息重定向到我的路由'错误'?即

<?php
// error.blade.php

{{ $message }}
?>
Run Code Online (Sandbox Code Playgroud)

如果你能给我一个例子.

The*_*pha 14

Laravel默认情况下,声明了一个错误处理程序,app/start/global.php其中看起来像这样:

App::error(function(Exception $exception, $code) {
    Log::error($exception);
});
Run Code Online (Sandbox Code Playgroud)

如果没有声明其他特定处理程序,此处理程序基本上捕获每个错误.要声明特定的(仅针对一种类型的错误),您可以在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());
});
Run Code Online (Sandbox Code Playgroud)

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

阅读有关错误和记录的更多信息.


Raz*_*zor 10

只需使用命名空间

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);
}
Run Code Online (Sandbox Code Playgroud)

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

use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;
Run Code Online (Sandbox Code Playgroud)