讲师中心 微信公众号
AI工具推荐 视频效率加速

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

胖涛吖_6275

胖涛吖_6275

发布时间:2026-04-07 17:44:04

|

992人浏览过

|

来源于php中文网

原创

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 头来绕过这个机制。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
nginx 重启
nginx 重启

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

403

2023.07.27

nginx 配置详解
nginx 配置详解

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

3607

2023.08.04

nginx配置详解
nginx配置详解

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

6345

2023.08.04

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

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

581

2024.02.23

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

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

1496

2024.07.09

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

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

3978

2024.08.07

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

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

122

2026.01.13

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

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

497

2026.01.13

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共22课时 | 9.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn