<?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. nginx配置ssl证书实现https加密请求详解

    原文链接:http://www.studyshare.cn/software/details/1175/0 一.加密方式 1.对称加密 所谓对称加密即:客户端使用一串固定的秘钥对传输内容进行加密,服务 ...

  2. Python 标识符说明

    在Python中,标识符有字母.数字.下划线组成 所有标识符都可以包括英文.数字.下划线,但不能以数字开头 Python标识符区分大小写 ※以下划线开头的标识符有特殊含义. 例如:以单下划线开头(_t ...

  3. DIY显示器篇------DIY教程

    前言: DIY显示器是这几年才火起来的,或者说这几年在游戏圈火起来的.我第一次看到是在NGA上,一位玩PUBG的大佬自己DIY了一个显示器,27寸 2k 144 ips的屏幕,当时市面上只有四款显示器 ...

  4. HTML的发展及认识

    首先HTML全称是Hypertext Markup Language,它是一门超文本标记语言: HTML已经有了HTML2.0.HTML3.2.HTML 4.0. HTML4.01. HTML5几个阶 ...

  5. Linux命令行中好用的快捷键

    Ctrl + L:清屏,与clear同效: Ctrl + D:终结当前程序,向终端传递EOF(End Of File): Ctrl + A:光标移至一行命令开头: Ctrl + E:光标移至一行命令结 ...

  6. CNN中1x1 卷积的处理过程及作用

    参看:https://blog.csdn.net/ybdesire/article/details/80314925

  7. 使用VS Code 开发.NET CORE 程序指南

    1. 前言 近两年来,很多前端的同学都开始将 VSCode 作为前端主力开发工具,其丰富的扩展给程序开发尤其是前端开发带来了很多便利,但是作为微软主力语言的 .NET,却由于有宇宙第一编辑器 Visu ...

  8. three.js实现球体地球城市模拟迁徙

    概况如下:1.SphereGeometry实现自转的地球:2.THREE.ImageUtils.loadTexture加载地图贴图材质:3.THREE.Math.degToRad,Math.sin,M ...

  9. MySQL数据库笔记六:数据定义语言及数据库的备份和修复

    1. MySQL中的函数 <1>加密函数 password(str) 该函数可以对字符串str进行加密,一般情况下,此函数给用户密码加密. select PASSWORD('tlxy666 ...

  10. DOM的选择器

    这几天学习了DOM的选择器,现在来进行一下总结分类. 1.DOM里的元素节点选择器 元素节点选择器包括id,class,name,tagname,高级,关系. 1.1 id选择器 id:返回的是单个对 ...