Laravel捕获异常并向messagebag添加消息

时间:2015-02-13 11:00:53

标签: php exception laravel laravel-4

我有一个存储库,如果它无法在数据库中找到记录,则会抛出异常。我不想重定向到另一个页面,而只是想显示一个警告提示,因为该记录对于页面并不重要,但却是一个“异常事件”。

最好用代码演示:

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

1 个答案:

答案 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