我制作了下面的控制器来演示处理我在laravel中使用dingo api的500个错误的问题。我希望能够检测何时会抛出500错误,因此它永远不会发送到客户端(因为它与客户端共享的细节太多而且只能由Laravel记录)。
由于拼写错误getUser()
firsgt()
会故意返回500错误
class TestController extends Controller {
public function getUser() {
$data = User::firsgt(); //returns 500 error
return $data;
}
}
在我的控制器中,我通过从控制器内返回成功/错误json响应来手动处理错误,但是如果发生了我没想到的错误,则api返回它并且它有太多详细信息供客户端查看。相反,这些意外错误应该冒泡到某种处理程序以返回一般错误发生的响应。在Laravel中,在APP_DEBUG = false
中设置.env
适用于laravel(但不适用于dingo api),这不起作用,并且将完整错误返回给客户端。寻找安全网,以防止裂缝中的错误。
我们如何返回错误消息,例如'发生错误'而不是客户的太多细节'调用未定义的方法App \ User :: firsgt()'?
注意:我不想为每个控制器方法逐个处理它,而是在它返回到客户端之前捕获任何500,并返回自定义500通用消息'发生错误&#39 ;
答案 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
替换为通用消息