如何使用laravel捆绑包对404/500错误做出不同的响应?

时间:2012-10-24 17:59:16

标签: php api laravel

我有一个用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错误做出不同的响应?

谢谢!

3 个答案:

答案 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)方法中。