Laravel捕获异常并将消息添加到消息包中


Laravel catch exception and add message to a messagebag

我有一个存储库,如果它在数据库中找不到记录,就会抛出异常。与其重定向到另一个页面,我只想显示一个警告警报,因为该记录对页面并不重要,而是一个"异常事件"。

最好用代码进行演示:

// 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变量吗?还是应该为此创建一个新的、特定的消息包?

问题是,如果您不从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包