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

Laravel Dingo API - Only log 500 error, never send error details via api?

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

方法getUser() return由于错字 firsgt()

故意造成 500 错误
class TestController extends Controller {
  public function getUser() {
    $data = User::firsgt(); //returns 500 error
    return $data;
  }
}

这是客户看到的:

在我的控制器中,我通过 return 控制器内部的 success/error json 响应来手动处理错误,但是如果发生了我没有预料到的错误,api returns 它,它有太多的细节让客户看到。相反,这些意外错误应该冒泡到某种处理程序以 return 发生一般错误响应。在 Laravel 中,在 .env 中设置 APP_DEBUG = false 对 laravel 有效(但对 dingo api 无效),这没有效果,完整的错误是 returned给客户。为漏掉的错误寻找安全网。

我们如何 return 像 'Error occurred' 这样的错误消息而不是为客户提供太多详细信息 'Call to undefined method App\User::firsgt()'?

注意:我不想为每个控制器方法一一处理,而是在 returned 到客户端之前捕获任何 500,并且 return 自定义 500 通用留言 'Error occurred'

您应该检查您的 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);
    }
});

Beware that I didnt test this myself.

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

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

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

用通用消息替换:message