0

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

谢谢!

4

3 回答 3

1

您是否尝试过覆盖捆绑包中的主要应用程序侦听器?当您的包被调用时,这应该将它们作为侦听器删除,并且只留下事件的包侦听器。

Event::override()您可以使用方法而不是监听方法来覆盖事件。

Event::override('404', function()
{
    return Response::json(array('status' => 'error', 'message' => 'API endpoint not found.'));
});
于 2012-10-25T05:50:31.573 回答
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 中的基本控制器中添加类似的内容。

于 2012-11-14T16:49:34.893 回答
0

您的 API 可以像这样直接返回响应:

return Response::make(json_encode($array), 404);

当然,您可以将其封装到自己的$yourApiController->error($data, $code)方法中。

于 2012-10-24T20:26:20.933 回答