Yii2自定义JSON格式响应

 提示:转载请注明原文链接

 本文永久链接:https://www.360us.net/article/50.html

默认是有个JsonResponseFormatter的,但是呢,我们如果做APP的API的话,json响应的格式和内容,每个人的约定都是有差异的,不可能和yii2默认的相一致。

之前通过搜索搜索到的答案是,给Response对象的EVENT_BEFORE_SEN事件注册一个处理函数,在发送结果之前再处理一下。


原文链接:https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-error-handling.md


主要代码如下:

return [
    // ...
    'components' => [
        'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                if ($response->data !== null && !empty(Yii::$app->request->get('suppress_response_code'))) {
                    $response->data = [
                        'success' => $response->isSuccessful,
                        'data' => $response->data,
                    ];
                    $response->statusCode = 200;
                }
            },
        ],
    ],
];

按照上面的方法,需要在配置文件里面写函数,总感觉不好啊!配置就是配置,写什么逻辑嘛!

然后我就是写了个基类,在里面注册事件:

//发送结果之前,自定义处理一下
Yii::$app->getResponse()->on(Response::EVENT_BEFORE_SEND, [ResponseFormater::getInstance(), 'process']);


后面我发现可以还有其他方式。


重新写一个json格式化类,继承默认的\yii\web\JsonResponseFormatter,然后我们只需要重写formatJson方法即可。

然后在配置文件里面配置:

'response' => [
    'format' => 'json',
    'formatters' => [
        'json' => 'api\components\ApiJsonResponse',
    ],
],


api\components\ApiJsonResponse就是我们重写formatJson方法的类。

这样子就好了,好看多了。

 评论
暂无评论