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

时间:2017-11-15 16:55:21

标签: laravel laravel-5 api-design laravel-5.5 laravel-response

我制作了以下控制器来演示处理我在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

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

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

5 个答案:

答案 0 :(得分:2)

只需更改.env文件中的变量,以防止这些消息与响应一起发送。

APP_ENV =生产

APP_DEBUG=false

编辑:只需将APP_DEBUG设置为false即可。

<强>更新 如果您正在使用dingo api软件包,那么在将APP_DEBUG设置为false之后,您需要编辑配置文件。

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

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

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

:message替换为通用消息

答案 1 :(得分:1)

你有app/Exception/Handler.php课来做这件事。例如,您可以使用与此类似的代码:

public function render($request, Exception $e)
{
    $exception_class = get_class($e);

    if (!in_array($exception_class, [ValidationException::class, ModelNotFoundException::class] ) {
       return response()->json(['info' => 'Error occurred'], 500);
    }

   return parent::render();
}

但是如您所见,您应该排除一些您希望以正常方式呈现的异常类,这里只是一些示例异常类。

显然,如果您正在设计API,可能根本没有必要使用parent::render(),您应该以自定义方式处理自定义异常类,然后最后针对其他异常只返回500响应并显示您想要的消息。

答案 2 :(得分:1)

您可以使用try ... catch

try{
   .....
}catch(\Exception $e){
  if($e->getCode() == 500){
      return response()->json(["error"=>'$e->getCode()'],500);
  }
}

答案 3 :(得分:1)

Laravel已经为您完成了此操作,但前提是您处于生产模式并且请求期望JSON。

无论如何, App \ Exceptions \ Handler 类是可以处理所有异常的地方。它也是Laravel本身记录和呈现所有异常的地方。

public function render($request, Exception $exception)
{
    // your logic here

    return parent::render($request, $exception);
}

答案 4 :(得分:1)

错误的详细说明显示在开发环境中,对于您不希望显示它们的生产 - 出于安全原因 - 因此,正如@Hamoud所述,转到您的.ENV文件找到该行:

APP_DEBUG=true

将其更改为:

APP_DEBUG=false

这将仅显示标准错误响应。查看有关error details

的文档