<?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控制器中加入析构函数的更多相关文章

  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. 使用Qt5+CMake实现图片的区域选择(附源码)

    近期研发涉及到了图片的区域选择,找来一些资料一直不能很满意,所以自己实现了一个. 实现步骤如下.源码可以点击ImageAOI获取. 如下资料来自源码的README. ImageAOI (XLabel) ...

  2. SSM框架的详细解说

    文章转载自:http://blog.csdn.net/zhshulin 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就 ...

  3. Map集合的遍历(利用entry接口的方式)

    核心思想: 调用map集合中的方法entrySet()将集合中的映射关系存放在Set集合中. 迭代Set集合 获取出的Set集合的元素是映射关系对象 通过映射关系对象方法的getKey(),getVa ...

  4. 使用Cmake编译CEF时遇到Error in configuration process,project file may be invalid的解决办法

    今天在用Cmake编译cef框架时,弹出了错误,如图: 可以排查一下几种原因: 1.在64位计算机编译32位程序 可以更换编译环境,或者下载64位版本来解决这个问题. 2.选择的Visual Stud ...

  5. IDEA部署 java Web项目 常见配置

    前言 从eclipse上转到idea上,第一次使用idea部署web项目,真折磨人,写了一个 helloworld 5分钟,了解idea部署web项目5小时. 我使用的是idea 2019.1版本,其 ...

  6. springboot --AopLog

    在项目 pom.xml 文件中添加依赖: <!-- aop 依赖 --> <dependency> <groupId>org.springframework.boo ...

  7. HTTP head请求

    GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体. PUT: 从客户端向服务器传送的数据取代指定 ...

  8. 过滤掉Abp框架不需要记录的日志

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 问题 ABP.WindowsService/Demo.MyJob/4.0.0该项目不仅 ...

  9. [python]代码中包含中文,提示:SyntaxError: Non-ASCII character '\xcd'

    解决方法: 把文件编码方式改为gbk即可.在代码开头写上: # coding=gbk

  10. HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)

    题意:一共有n名员工, n-1条关系, 每次给一个人分配任务的时候,(如果他有)给他的所有下属也分配这个任务, 下属的下属也算自己的下属, 每次查询的时候都输出这个人最新的任务(如果他有), 没有就输 ...