Yii框架的响应格式化器怎么自定义_实现自己的ResponseFormatter【解答】

胖涛吖_6275

胖涛吖_6275

2026-04-07

992人浏览

原创

yii2中需在config/web.php的response组件中配置formatters数组,键名须与accept头主类型(如'json')精确匹配,值为类名或配置数组;自定义类必须重写formatjson()和formatjsonp()方法,并注意$data已是处理后的php结构。

yii框架的响应格式化器怎么自定义_实现自己的responseformatter【解答】

Yii2 中如何注册自定义 ResponseFormatter

直接在应用配置里挂载,别试图在控制器里临时改——ResponseFormatter 是全局响应管道的环节,运行时替换会失效或被覆盖。

常见错误是写完类就去 Controller::beforeAction() 里调用 $response->formatters['json'] = new MyJsonFormatter,这完全没用,因为格式化器在 Response::send() 前就被固定使用了。

  • 在 config/web.php 的 'components' => ['response' => [...]] 里配 'formatters' 数组
  • 键名必须和 Accept 头匹配(如 'json' 对应 application/json),不能随便起名
  • 值必须是类名字符串或配置数组,不支持匿名函数或对象实例(框架会自己 new)
'response' => [
    'class' => 'yii\web\Response',
    'formatters' => [
        'json' => [
            'class' => 'app\components\MyJsonFormatter',
            'prettyPrint' => YII_DEBUG,
        ],
    ],
],

自定义 JsonResponseFormatter 必须重写的两个方法

不是继承就完事,formatJson() 和 formatJsonp() 都得显式覆盖——框架不会自动代理,漏掉任一个,对应请求类型就会 fallback 到默认行为,比如 callback=xxx 请求直接 500。

典型场景:统一加 code/message 包裹、过滤敏感字段、处理 DateTime 序列化。别在 formatJson() 里做耗时操作(如查库),它在响应发送前才执行,会影响所有 JSON 接口。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
  • formatJson() 处理普通 application/json
  • formatJsonp() 处理带 callback 参数的 JSONP(即使你不用,也得空实现,否则报 Call to undefined method)
  • 父类的 $encodeOptions 默认不含 JSON_UNESCAPED_UNICODE,中文会转义,记得补上
public function formatJson($response)
{
    $data = $response->data;
    $response->data = [
        'code' => isset($data['code']) ? $data['code'] : 0,
        'message' => isset($data['message']) ? $data['message'] : 'OK',
        'data' => $data['data'] ?? $data,
    ];
    parent::formatJson($response);
}

为什么 $response->data 在 formatter 里还是原始数组?

因为 Yii 的 formatter 只负责“编码”,不负责“构造数据结构”。你在 Controller 里写的 return ['user' => $model] 或 $this->asJson([...]),到 formatter 时已经是 PHP 数组/对象,没经过任何中间层加工。

容易踩的坑:有人想在 formatter 里自动把 ActiveRecord 转成数组,结果发现 $response->data 已经是 toArray() 后的结果——那是 JsonResponseFormatter 自己干的,你再转一次会出错;如果传进来的是对象且没实现 JsonSerializable,PHP 会直接报 TypeError。

  • 检查控制器返回值类型:避免直接 return 模型对象,显式调用 $model->toArray()
  • 若需统一序列化逻辑,应该在基类控制器或行为(Behavior)里拦截 asJson(),而不是塞到 formatter
  • formatter 里对 $response->data 做 json_encode() 是重复劳动,框架已做

调试 formatter 不生效的三个关键检查点

90% 的“自定义不生效”问题出在这三处,别急着翻源码。

  • 确认请求头 Accept: application/json 存在且没被 nginx / Apache 改写(比如反向代理清掉了头)
  • 检查 Response::$formatters 数组里键名是否和 Accept 值精确匹配(application/json; charset=UTF-8 仍走 'json',但 application/vnd.api+json 就不会)
  • 断点打在 Response::send() 里,看 $this->formatters[$this->getContentType()] 拿到的是不是你的类——如果不是,说明匹配失败或配置没加载

复杂点在于 Content-Type 解析依赖 yii\web\Response::getContentType() 的内部映射表,它不读 MIME 类型全量字符串,只取主类型(application/json 的 json 部分)。别指望靠改 Accept 头来绕过这个机制。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii yii框架

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

403

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3607

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6345

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

581

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1496

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3978

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

477

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

159

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习