1. <?php
  2.  
  3. namespace app\api\controller;
  4.  
  5. use think\Controller;
  6.  
  7. class User extends Controller
  8. {
  9. public $data = [
  10. 'code' => 0,
  11. ];
  12.  
  13. public function register()
  14. {
  15. // To do something
  16.  
  17. }
  18. public function login()
  19. {
  20. // To do something
  21. }
  22. }

  用ThinkPHP编写API服务的时候,一般都是直接Return输出Json数据,不需要View层渲染。

  上面是一段常规的API控制器代码,正常我们可能会在register和login方法中直接return json($this->data)。

  可是每个方法都来这么一下Return输出总觉得不太雅观(闲),想到了对象中有构造函数和析构函数,如果我们把Return输出放在析构函数中,执行完register和login方法后统一输出岂不是看起来简洁一些?

  这个时候有研究过析构函数的小伙伴会说:析构函数中无视return和exit语句的,会直接跳过……

  emmmmmm,白激动了。

  但是变通一下,我不能用return和exit语句的话,改用echo不就行了?代码如下:

  1. public function __destruct()
  2. {
  3. echo json($this->data);
  4. }

  问题接踵而来,ThinkPHP内置的json方法并不能被echo输出。

  行,我再换成json_encode函数,输出的data变量一样是json格式的!

  可是用Postman测试一下这个API接口后发现,请求返回后的header中显示内容格式不是application/json,而是text/html的!!!

  用header函数去修改header呢?

  1. header('Content-Type:application/json; charset=utf-8');

  无效,判断是ThinkPHP在echo后再次执行了header函数,把application/json又改回了config.php中默认设定的text/html。

  怎么样在不修改ThinkPHP配置或内核文件的情况下阻止ThinkPHP再次执行header方法呢?

  我想到了fastcgi_finish_request这个函数!!!

  1. public function __destruct()
  2. {
  3. header('Content-Type:application/json; charset=utf-8');
  4. echo json_encode($this->data);
  5. fastcgi_finish_request();
  6. }

  关于它的介绍,引用官方手册>>>

  简单来说它的作用就是直接把缓存区的内容输出返回,后续的操作由于http请求已经返回给客户端了,并没有任何修改的机会。

  一来它解决了header信息不会被再次修改,二呢,它加快API接口的响应速度,先返回客户端需要的数据,剩下和http请求无关的操作会在请求被返回后继续运行。

  这样就完美的解决问题了!

【ThinkPHP】API控制器中加入析构函数的更多相关文章

  1. ThinkPHP如何在控制器中调用命令

    前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...

  2. ASP.NET Web API 控制器执行过程(一)

    ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...

  3. ASP.NET Web API 控制器创建过程(二)

    ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...

  4. ASP.NET Web API 控制器创建过程(一)

    ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...

  5. Web API项目中使用Area对业务进行分类管理

    在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...

  6. ABP理论学习之Web API控制器(新增)

    返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...

  7. 1.2Web API 2中的Action返回值

    本主题描述 ASP.NET Web API 将返回值转换从一个控制器动作到 HTTP 响应消息. 一个 Web API 控制器动作可以返回下列任一操作 ︰ 1.void 2.IHttpActionRe ...

  8. selected 刷新页面后selected选中的值保持不表(thinkphp 从控制器assign 传值到js)

    昨晚解决select 刷新页面以后选择的值保持不变,要想让seleted不变,有两种思路, 1,在提交表单的时候,将所选择的option的属性设为checked . 2.将option的value或者 ...

  9. Asp.Net Web API 2第八课——Web API 2中的属性路由

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...

随机推荐

  1. JS鼠标吸粉特效

    HTML <canvas id=canvas></canvas> CSS * { margin: 0; padding: 0; } html { overflow: hidde ...

  2. 常用maven 命令

    重新依赖:mvn package -U -DskipTest=true; 在本地安装jar包:mvn install 清除产生的项目:mvn clean 运行测试:mvn test 上传到私服:mvn ...

  3. Elasticsearch由浅入深(一)

    什么是Elasticsearch 什么是搜索 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象 ...

  4. 使用flash2print 代替 printflash 将office文档 转为flash 在页面中播放

    前一些日子公司需求把用户上传的一些word等 文档 能像百度文库那样 显示给用户, 但是如果是直接显示office文档的话就需要  些控件的支持 .非常的不友好,所以 一开始我就想能不能转成pdf 来 ...

  5. Go-TCP粘包

    TCP黏包 黏包示例 服务端代码如下: // socket_stick/server/main.go func process(conn net.Conn) { defer conn.Close() ...

  6. Selenium+java - 手把手一起搭建一个最简单自动化测试框架

    写在前面 我们刚开始做自动化测试,可能写的代码都是基于原生写的代码,看起来特别不美观,而且感觉特别生硬. 来看下面一段代码,如下图所示: 从上面图片代码来看,具体特征如下: driver对象在测试类中 ...

  7. 你真的了解setState()吗?

    React 中 setState()详细解读 对于 setState() 相信伙伴们都用过,它是 React 官方推荐用来更新组件 state 的 API,但是对于 setState() 你真的了解吗 ...

  8. pringboot pom文件引入本地jar包和对其打jar包

    maven引入本地jar包需要在pom文件中天剑如下配置: <dependency> <groupId>com.baidu</groupId> <artifa ...

  9. Dig命令使用大全(转自别人翻译),稍加整理

    Dig简介:   Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具.由于一直缺失Dig man page文档,本文就权当一个dig使用向导吧.   Dig的 ...

  10. Unity之与Web的交互

    一.下载,安装,配置,启动Apache 1.进入官网下载Apache 2.解压到根目录 3.记事本打开如下配置文件 4.安装apache 5.出现错误:(该错误是由于端口被占用引起的) 6.修改配置文 ...