ThinkPHP 通用的API格式封装

简介: 本文介绍了在ThinkPHP框架中如何统一封装API返回格式的方法,包括创建状态码枚举类、编写统一格式化函数以及在BaseController和Error控制器中重写`__call`方法来处理不存在的方法或控制器调用,以实现统一的错误处理和返回格式。

1.创建status.php 用于设置通用的状态码返回枚举类

<?php

return[
    "success"=>1,
    "error"=>0,
    "controller_not_found"=>-1,
    "action_not_found"=>-2,
];

2.将API返回格式统一封装

<?php

/**API 统一格式化
 * @param $status
 * @param $message
 * @param $data
 * @param $httpStatus
 * @return \think\response\Json
 */
function show($status,$message,$data=[],$httpStatus=200){
   

    $result = [
      "status"=>$status,
      "message"=>$message,
      "data"=>$data,
    ];

    return json($result,$httpStatus);
}

3.重写BaseController中的__call方法

在BaseController中重写__call方法,当调用不存在的方法时,就会调用__call方法,会传入请求方法和参数

<?php
declare (strict_types = 1);

namespace app;

use think\App;
use think\exception\ValidateException;
use think\Validate;


/**
 * 控制器基础类
 */
abstract class BaseController
{
   
    /**
     * Request实例
     * @var \think\Request
     */
    protected $request;

    /**
     * 应用实例
     * @var \think\App
     */
    protected $app;

    /**
     * 是否批量验证
     * @var bool
     */
    protected $batchValidate = false;

    /**
     * 控制器中间件
     * @var array
     */
    protected $middleware = [];

    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app)
    {
   
        $this->app     = $app;
        $this->request = $this->app->request;

        // 控制器初始化
        $this->initialize();
    }

    // 初始化
    protected function initialize()
    {
   }

    /**
     * 验证数据
     * @access protected
     * @param  array        $data     数据
     * @param  string|array $validate 验证器名或者验证规则数组
     * @param  array        $message  提示信息
     * @param  bool         $batch    是否批量验证
     * @return array|string|true
     * @throws ValidateException
     */
    protected function validate(array $data, string|array $validate, array $message = [], bool $batch = false)
    {
   
        if (is_array($validate)) {
   
            $v = new Validate();
            $v->rule($validate);
        } else {
   
            if (strpos($validate, '.')) {
   
                // 支持场景
                [$validate, $scene] = explode('.', $validate);
            }
            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
            $v     = new $class();
            if (!empty($scene)) {
   
                $v->scene($scene);
            }
        }

        $v->message($message);

        // 是否批量验证
        if ($batch || $this->batchValidate) {
   
            $v->batch(true);
        }

        return $v->failException(true)->check($data);
    }

    // 重写__call部分
    public function __call(string $name, array $arguments)
    {
   
        // TODO: Implement __call() method.
        return show(config("status.action_not_found"),"找不到{$name}方法",null,404);
    }
}

在这里插入图片描述

4.在控制器下面新建Error控制器,然后添加__call方法

在控制器下面新建Error控制器,然后添加__call方法,这样就会调用不存在的控制器的时候会调用__call方法,会传入请求的控制器名称和参数

<?php
namespace app\index\controller;

class Error{
   

    public function __call(string $name, array $arguments)
    {
   
        // TODO: Implement __call() method.
        return show(config("status.controller_not_found"),"找不到{$name}控制器",null,404);
    }
}

测试

在这里插入图片描述

在这里插入图片描述

假定一个成功的请求,测试一下

public function jsonTest(){
   
    $data = ['name' => 'thinkphp', 'status' => '1'];
    return show(config("status.success"),"请求成功",$data);
}

在这里插入图片描述


相关文章
|
5月前
|
数据采集 Java API
深度解析:爬虫技术获取淘宝商品详情并封装为API的全流程应用
本文探讨了如何利用爬虫技术获取淘宝商品详情并封装为API。首先介绍了爬虫的核心原理与工具,包括Python的Requests、BeautifulSoup和Scrapy等库。接着通过实战案例展示了如何分析淘宝商品页面结构、编写爬虫代码以及突破反爬虫策略。随后讲解了如何使用Flask框架将数据封装为API,并部署到服务器供外部访问。最后强调了在开发过程中需遵守法律与道德规范,确保数据使用的合法性和正当性。
|
21天前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
126 0
|
3月前
|
人工智能 API 定位技术
MCP 开发实战:手把手教你封装高德地图与 arXiv API
本教程为 MCP(Model Context Protocol)开发实战第二阶段,带你从零封装第三方 API 为 AI 模型可用工具。通过高德地图地理编码与 arXiv 论文检索两个实例,涵盖项目搭建、工具声明、资源定义、错误处理等核心内容,助你快速上手 MCP 开发并集成至 Claude 使用。
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
10月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
11月前
|
JSON API 数据格式
获取商品详情API的请求格式是什么
获取商品详情API的请求格式通常依赖于特定的电商平台或服务提供商,但一般遵循类似的结构。以下是一个概括性的说明,以及针对几个主流电商平台的示例:
|
12月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
JSON 前端开发 API
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
162 4
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
安全 API PHP
ThinkPHP 资源路由的简单使用,restfull风格API
本文介绍了在ThinkPHP框架中使用资源路由来创建RESTful风格的API,包括如何通过命令行创建资源控制器,注册资源路由,以及资源控制器中各方法的默认操作和测试方法。
ThinkPHP 资源路由的简单使用,restfull风格API