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()代码>让我这样解释。如果您将概述关系作为属性调用,它会将它们全部作为集合获取,并且您可以获得集合类提供的任何内容。但是,如果您将其作为方法调用,那么您指的是查询生成器。