Laravel 5 Laravel:未找到资源异常

Laravel 5 Laravel:未找到资源异常,laravel-5,Laravel 5,假设您有这样一个简单的资源路由: Route::resource('overview', 'OverviewController'); 并点击你知道不存在的路线。例如: /overview/sdflkjdsflkjsd /overview/sdflkjdsflkjsd/edit 在我的例子中,它从我的视图中抛出试图获取非对象属性的错误(因为找不到资源) 我考虑过从添加“正则表达式参数约束”,但看起来这些约束也不适用于资源路由(另外,并没有真正解决问题) 我正在寻找一种方法来为这种事情抛出

假设您有这样一个简单的资源路由:

Route::resource('overview', 'OverviewController');
并点击你知道不存在的路线。例如:

/overview/sdflkjdsflkjsd  
/overview/sdflkjdsflkjsd/edit
在我的例子中,它从我的视图中抛出试图获取非对象属性的
错误(因为找不到资源)

我考虑过从添加“正则表达式参数约束”,但看起来这些约束也不适用于资源路由(另外,并没有真正解决问题)

我正在寻找一种方法来为这种事情抛出一个异常,然后我可以处理一次,而不是为每个操作(或者至少是
显示
编辑
操作)添加逻辑。。如果可能的话


编辑在查看github之后,我在Symphony repo中发现了一个例外。有什么方法可以钩住它吗?

因为您在尝试获取非对象的属性时遇到了一个
错误,我假设您是通过
YourModel::find()获取资源的

我建议您改用
YourModel::findOrFail()
。然后,您将得到一种特定类型的异常,称为
ModelNotFoundException
。只需为此注册一个错误处理程序

比如说,

App::error(function(ModelNotFoundException $e)
{
    return Response::make('Not Found', 404);
});
更新:这实际上会进入Laravel 5.1中的
app/Exceptions/Handler.php
文件中的render()方法,当然代码会使用传递的$e参数

public function render($request, Exception $e)
{
   if ($e instanceof ModelNotFoundException)
   {
        return \Response::make('Not Found', 404);
   }
    return parent::render($request, $e);
}

谢谢,findOrFail是一个很好的答案,可以在一行上完成。但是,它在我的情况下不起作用,因为我实际上是在查询这样的关系:
$overview=$event->overview->find($id)
。我发现很多雄辩的模型功能对于雄辩的集合是不存在的(另一个缺少的有用功能是'whereNotNull')。您仍然可以使用它。只需在关系查询而不是集合上调用它。事实上,您可以包含任何您想要的where子句。所以应该是
$event->overview()->whereNotNull('fieldName')->firstOrFail()让我这样解释。如果您将概述关系作为属性调用,它会将它们全部作为集合获取,并且您可以获得集合类提供的任何内容。但是,如果您将其作为方法调用,那么您指的是查询生成器。