我制作了以下控制器来演示处理我在api中遇到的500个错误的问题。我希望能够检测何时会抛出500错误,因此它永远不会发送到客户端(因为它与客户端共享的细节太多而且只能由Laravel记录)。
由于拼写错误getUser()
firsgt()
会故意返回500错误
class TestController extends Controller {
public function getUser() {
$data = User::firsgt(); //returns 500 error
return $data;
}
}
我们如何返回错误消息,例如'错误发生'而不是客户端的太多细节'调用未定义的方法App \ User :: firsgt()'?
注意:我不想为每个控制器方法逐个处理它,而是在将它返回到客户端之前捕获任何500,并返回自定义500通用消息“发生错误”
答案 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。
的文档