【ThinkPHP】API控制器中加入析构函数
<?php namespace app\api\controller; use think\Controller; class User extends Controller
{
public $data = [
'code' => 0,
]; public function register()
{
// To do something }
public function login()
{
// To do something
}
}
用ThinkPHP编写API服务的时候,一般都是直接Return输出Json数据,不需要View层渲染。
上面是一段常规的API控制器代码,正常我们可能会在register和login方法中直接return json($this->data)。
可是每个方法都来这么一下Return输出总觉得不太雅观(闲),想到了对象中有构造函数和析构函数,如果我们把Return输出放在析构函数中,执行完register和login方法后统一输出岂不是看起来简洁一些?
这个时候有研究过析构函数的小伙伴会说:析构函数中无视return和exit语句的,会直接跳过……
emmmmmm,白激动了。
但是变通一下,我不能用return和exit语句的话,改用echo不就行了?代码如下:
public function __destruct()
{
echo json($this->data);
}
问题接踵而来,ThinkPHP内置的json方法并不能被echo输出。
行,我再换成json_encode函数,输出的data变量一样是json格式的!
可是用Postman测试一下这个API接口后发现,请求返回后的header中显示内容格式不是application/json,而是text/html的!!!
用header函数去修改header呢?
header('Content-Type:application/json; charset=utf-8');
无效,判断是ThinkPHP在echo后再次执行了header函数,把application/json又改回了config.php中默认设定的text/html。
怎么样在不修改ThinkPHP配置或内核文件的情况下阻止ThinkPHP再次执行header方法呢?
我想到了fastcgi_finish_request这个函数!!!
public function __destruct()
{
header('Content-Type:application/json; charset=utf-8');
echo json_encode($this->data);
fastcgi_finish_request();
}
关于它的介绍,引用官方手册>>>
简单来说它的作用就是直接把缓存区的内容输出返回,后续的操作由于http请求已经返回给客户端了,并没有任何修改的机会。
一来它解决了header信息不会被再次修改,二呢,它加快API接口的响应速度,先返回客户端需要的数据,剩下和http请求无关的操作会在请求被返回后继续运行。
这样就完美的解决问题了!
【ThinkPHP】API控制器中加入析构函数的更多相关文章
- ThinkPHP如何在控制器中调用命令
前段时间因为业务需求,使用TP的command开发了几个模块,期间测试一下在控制器中调用命令的方式,发现一些问题记录一下 官方文档: <?php namespace app\index\cont ...
- ASP.NET Web API 控制器执行过程(一)
ASP.NET Web API 控制器执行过程(一) 前言 前面两篇讲解了控制器的创建过程,只是从框架源码的角度去简单的了解,在控制器创建过后所执行的过程也是尤为重要的,本篇就来简单的说明一下控制器在 ...
- ASP.NET Web API 控制器创建过程(二)
ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...
- ASP.NET Web API 控制器创建过程(一)
ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...
- Web API项目中使用Area对业务进行分类管理
在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...
- ABP理论学习之Web API控制器(新增)
返回总目录 本篇目录 介绍 AbpApiController基类 本地化 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.ApiNuget包集成了 ASP.NET Web API控制器 ...
- 1.2Web API 2中的Action返回值
本主题描述 ASP.NET Web API 将返回值转换从一个控制器动作到 HTTP 响应消息. 一个 Web API 控制器动作可以返回下列任一操作 ︰ 1.void 2.IHttpActionRe ...
- selected 刷新页面后selected选中的值保持不表(thinkphp 从控制器assign 传值到js)
昨晚解决select 刷新页面以后选择的值保持不变,要想让seleted不变,有两种思路, 1,在提交表单的时候,将所选择的option的属性设为checked . 2.将option的value或者 ...
- Asp.Net Web API 2第八课——Web API 2中的属性路由
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...
随机推荐
- pull解析案例
此pull解析案例是eclipes的对不对,不知道, private void getXml() { try { InputStream is = getAssets().open("new ...
- Git原理入门简析
为了获得更好的阅读体验,建议访问原地址:传送门 前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的 ...
- 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi
优雅的在WinForm/WPF/控制台 中使用特性封装WebApi 说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpL ...
- 理解Go协程与并发
协程 Go语言里创建一个协程很简单,使用go关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) fun ...
- Unity进阶之ET网络游戏开发框架 08-深入登录成功消息
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Okhttp3源码解析(2)-Request分析
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...
- 使用注解的Hibernate one-to-many映射
One to many映射关系指的是两个实体间一个实体可以和多个实体有关联关系,但是多的这一端只能和一的这一端的一个实例有关系.它是一个1 到 n的关系.例如在任何的公司员工可以注册多个银行账户,一个 ...
- 解决ionic 中 $ionicHistory.goBack()无法返回
这种解决方法目前只适合用了 <ion-side-menus>这一组件的<ion-view> 解决方法: 在<ion-view>下一级中包一个div,如下图: 搞了几 ...
- [Python] 将视频转成ASCII符号形式、生成GIF图片
一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...
- 【原创】Linux Suspend流程分析
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...