Laravel Dingo API - 仅记录500错误,从不通过api发送错误详细信息?

时间:2017-11-16 17:24:21

标签: laravel api-design laravel-5.5 dingo-api

我制作了下面的控制器来演示处理我在laravel中使用dingo api的500个错误的问题。我希望能够检测何时会抛出500错误,因此它永远不会发送到客户端(因为它与客户端共享的细节太多而且只能由Laravel记录)。

由于拼写错误getUser()

,方法firsgt()会故意返回500错误
class TestController extends Controller {
  public function getUser() {
    $data = User::firsgt(); //returns 500 error
    return $data;
  }
}

这是客户看到的: enter image description here

在我的控制器中,我通过从控制器内返回成功/错误json响应来手动处理错误,但是如果发生了我没想到的错误,则api返回它并且它有太多详细信息供客户端查看。相反,这些意外错误应该冒泡到某种处理程序以返回一般错误发生的响应。在Laravel中,在APP_DEBUG = false中设置.env适用于laravel(但不适用于dingo api),这不起作用,并且将完整错误返回给客户端。寻找安全网,以防止裂缝中的错误。

我们如何返回错误消息,例如'发生错误'而不是客户的太多细节'调用未定义的方法App \ User :: firsgt()'?

注意:我不想为每个控制器方法逐个处理它,而是在它返回到客户端之前捕获任何500,并返回自定义500通用消息'发生错误&#39 ;

2 个答案:

答案 0 :(得分:1)

你应该检查你的dingo配置并将这两个参数设置为false。

APP_DEBUG=false
API_DEBUG=false

如果您仍然遇到问题,请按照评论中的建议确保您正在投入使用。

最后,如果您仍然遇到相同的问题(现在通常在将这些字段设置为false后通常不应该存在),那么您可能有兴趣检查this issue(自2015年以来的日期)。

其中一条评论的修正案(逐字):

app(\Dingo\Api\Exception\Handler::class)->register(function (\Exception $exception) {
    if (!env('API_DEBUG') && !$exception instanceof \Symfony\Component\HttpKernel\Exception\HttpException) {
        // Whatever other handling you want goes here..

        // Mimic the normal API response with a different message
        return \Response::make([
            'message'     => 'Internal server error',
            'status_code' => 500,
        ], 500);
    }
});
  

请注意我自己没有测试过。

答案 1 :(得分:0)

如果您还没有完成,请发布dingo配置文件

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

然后,打开config/api.php并将errorFormat值编辑为您想要的任何消息。

:message替换为通用消息