Laravel自定义ModelNotFoundException处理每个路由组

时间:2014-10-06 14:19:59

标签: php laravel error-handling routing

我的Laravel应用程序中有两个路由组,一个用于API,另一个用于网站本身。我在global.php中添加了以下代码,用于我的API的错误处理。

App::error(function(ModelNotFoundException $e)
{
   return Response::json('', 404);
});

但是这显然也不会对我的普通网站产生影响,我希望在ModelNotFoundException发生时返回普通视图。像这样:

App::error(function(ModelNotFoundException $e)
{
   return Response::view('404.html', [], 404);
});

如何为不同的路由组设置不同的错误处理程序?

2 个答案:

答案 0 :(得分:0)

您可以尝试改变环境。对于选定的组,您可以使用以下方式更改环境:

$app->setEnvironment('enviromentname');

并在environmentname.php目录

中创建新的start文件

但我不知道它是否会奏效。

您还可以创建会话变量,并在App:error中添加代码,具体取决于此会话变量:

   $value = Session::get('type');

  if ($value == 'onetype') {
     // something
  }
  else {
    // something else
  }

答案 1 :(得分:0)

我认为您不应该关心网站的哪个部分会引发错误,而是以客户请求的任何格式进行响应。通常,这是在请求的Accepts标头中设置的,可以通过以下方式在Laravel中访问:

if (Request::format() == 'json')
{
    //
}

(以上摘自documentation

在您的情况下,这会将您的错误处理功能转换为:

App::error(function(ModelNotFoundException $e)
{
   if (Request::format() == 'json') {
       return Response::json('', 404);
   } else {
       return Response::view('404.html', [], 404);
   }
});

例如,如果您向网站的主要部分(无论出于何种原因)添加非API AJAX请求,可能会触发ModelNotFoundException,则会自动为您提供此保护。只要您的客户端发送了相应的请求标头,您就会很好。