我有一个用Laravel PHP框架编写的应用程序。我的主要应用程序监听404和500事件。
Event::listen('404', function()
{
return Response::error('404');
});
Event::listen('500', function()
{
return Response::error('500');
});
这会向用户显示我的自定义错误页面。但是现在,我还构建了一个API,它位于一个名为 api 的包中。这个API将通过Ajax使用,所以我想以不同的方式处理错误。所以我将这些事件添加到api包的routes.php中:
Event::listen('404', function()
{
return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.'));
});
Event::listen('500', function()
{
return Response::json(array('status' => 'error', 'message' => 'Internal server error'));
});
不幸的是,这不起作用,它仍然显示HTML错误页面。如何根据API或主要应用程序对404/500错误做出不同的响应?
谢谢!
答案 0 :(得分:1)
您是否尝试覆盖捆绑包中的主要应用程序侦听器?这应该在调用bundle时将它们作为侦听器删除,并且只留下事件的bundle侦听器。
您可以使用Event::override()
方法而不是listen方法覆盖事件。
Event::override('404', function()
{
return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.'));
});
答案 1 :(得分:1)
在routes.php中,将事件侦听器更改为:
Event::listen('404', function()
{
if (URI::segment(1) == 'api') {
return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.'),404);
}
return Response::error('404');
});
您可能需要在__call catch-all中添加基本控制器中的类似内容。
答案 2 :(得分:0)
您的API可以直接返回响应,如下所示:
return Response::make(json_encode($array), 404);
当然,您可以将其封装到自己的$yourApiController->error($data, $code)
方法中。