使用symfony构建restful应用 - restful异常处理
目标:
上篇文章我们构建了一个基础的 api 接口,本篇文章我们要构建自己的异常处理以及 restful 返回。
抛出异常
我们可以在控制器中主动抛出一个异常,像这样的:
1 |
|
你可以用curl
命令来(或者用postman
)请求[yourdomain]/hello/word
查看效果。
异常捕获
上面我们已经抛出了异常,接下来我们需要捕获这个异常并进行处理。
在symfony
中,有这么一个组件:
HttpKernel 组件提供了一个接口,该接口规范了从请求开始并创建适当响应的过程. 无论该系统的架构多么多样,该组件都是任何应用程序或框架的核心。
这个组件对外暴露了一个事件:kernel.exception
,可以让我们很轻松的实现自定义异常处理
在config/services.yaml
下加入以下代码:
1 | # design exception handler |
其中,App\EventListener\Exception
是我们的异常处理类,通过tags
来告知symfony
他是kernel.exception
事件的监听者。
下面我们来实现App\EventListener\Exception
类:
1 |
|
上面的代码中,我们捕获了抛出的异常,并且把异常信息以 json 数据形式返回。
自定义异常处理
上面的代码中我们能够通过onKernelException
方法,能够捕获到异常,但是我们并不知道是框架自己的异常还是我们主动抛出的异常。为了区分以及构建更友好的restful
结构,我们需要自定义异常。
我们在src
目录下创建Exception\Base
作为我们异常的基类。
1 |
|
以上的代码中,核心的代码即为构造方法。
结合我们的App\EventListener\Exception
,我们把他的代码改为如下:
1 |
|
以上的代码我们捕获了所有的异常,并且如果是继承自App\Exception\Base
异常的话能够很有好的返回 json 数据,其中包括了
status
-http 状态码message
-异常消息errorCode
-自定义错误码data
-返回数据requestUrl
-当前请求接口
能够应付大部分场景,如果你觉得还不够的话,可以补充。
使用异常
我们已经有了自定义的异常,我们怎么来使用它呢?
我们首先定义一个参数异常类App\Exception\Parameter
:
1 |
|
什么,才10
行代码?没错,就是如此简单。
然后我们可以在控制器使用它了。
1 |
|
为了避免重复,我们定义了另外一个路由hello\word
,只不过请求方式换了POST
而已。
产品环境下的 500 异常
如上,你已经自定义了异常处理了,但是细心的同学可能发现了,我们的抛出Exception
的时候,还是是由框架渲染的,在产品环境下,我们不希望用户看到这些异常。
所以,我们只需要在产品环境下让框架的异常正常返回就可以了。为此我们需要拿到配置环境的值。
在config/services.yaml
下加入以下代码:
1 | # design exception handler |
这样我们拿到了配置debug
的值。异常处理就容易了。
至此,完整的App\EventListener\Exception
类:
1 |
|
如上,我们已经完成了最复杂的一层构建。接下来我们来实现数据的校验层吧。
enjoy and happy coding!