我有一个存储库,如果它无法在数据库中找到记录,则会抛出异常。我不想重定向到另一个页面,而只是想显示一个警告提示,因为该记录对于页面并不重要,但却是一个“异常事件”。
最好用代码演示:
// FxRateRepositoy
public function getRate(/** args **/)
{
$rate = FxRate::where(.... //query to get the rate
if (!rate)
throw new NonExistentCurrencyException(//message);
return $rate;
}
在我的start / global.php中,我有一个处理程序:
App::error(function(NonExistentCurrencyException $e)
{
Session::flash('alert', $e->getMessage());
return \\ ??
});
返回什么?我必须返回一个回复或异常继续未被捕获。我想继续到预期的页面,但会话中闪烁警报。这可以在不调用此方法的每个地方使用try catch
块吗?
另外一个问题,假设在一个请求中可能多次抛出此异常,积累警报消息并显示它们的最佳方法是什么?我正在考虑类似于验证的messageBag
。我可以只使用全局$errors
变量,还是应该为此创建一个新的特定消息包?
答案 0 :(得分:1)
问题是如果你从App::error
没有返回任何内容,Laravel将显示它的默认错误页面。另一方面,您无法返回响应,因为您不知道它应该在错误处理程序中做出什么响应。
我建议你在控制器本身处理它。
你可以在那里捕捉异常并闪现消息或者根本不抛出异常:
$rate = FxRate::where(.... //query to get the rate
if (!rate){
Session::flash('alert', 'Whoops');
}
此外,findOrFail()
和firstOrFail
方法也可能有用。如果查询没有结果,则抛出ModelNotFoundException
:
try {
$rate = FxRate::where(....)->firstOrFail()
// and so on
} catch (Illuminate\Database\Eloquent\ModelNotFoundException $e){
Session::flash('alert', 'Whoops');
}
对于消息系统,请查看laracasts/flash package