Think PHP6+Swagger3

news2024/11/23 23:54:11

swagger是一个解决接口规范化、标准化、文档化的一个组件,既可以直接自动生成resutful接口文档又能进行功能测试的一个web服务。本文是think PHP6结合swagger3的一个记录过程。

composer安装ThinkPHP

一般安装最新稳定版本,不一定是最新版本

composer create-project topthink/think tp
运行测试

命令行执行命令

php think run

浏览器输入

http://localhost:8000/

或者更换端口

php think run -p 80

swagger-ui

gitclone

git clone https://github.com/swagger-api/swagger-ui.git

里面用到的是dist目录下的文件。复制swagger-ui下的dist文件夹到tp项目的public下,改不改名都行

修改swagger-initializer.js

修改rul
例如生成swagger.json放在public目录下的话,就改成如下

http://localhost:8000/swagger.json

安装swagger-php

composer require zircote/swagger-php 3.*

生成swagger.json

一、命令行生成

在public目录下生成一个swagger.json文件

php ./vendor/bin/openapi E:\code\tp\app -o E:\code\tp\public\swagger.json

第一个是安装成功后组件的路径
第二个是生成哪个目录下的所有用swagger方式注释的php文件。把注释生成api文档
第三个是存放swagger.json的路径

由于上面命令行每次修改文件都需要重新输入,所以可以添加下面的方法

二、快速更新文档(推荐)

路由文件

Route::get('swagger', 'index/swagger');

控制器

	public function swagger()
    {
        $openapi = \OpenApi\scan(root_path() . 'app');//你想要哪个文件夹下面的注释生成对应的API文档
        header('Content-Type: application/x-yaml');
        $jsonString = root_path() .'public/swagger.json';
        $res = file_put_contents($jsonString, $openapi->toJson());
        if ($res == true) {
            return redirect('http://localhost:8000/dist/index.html');
        }
    }
完整例子
<?php
namespace app\controller;

use app\BaseController;

/**
 * @OA\Info(title="thinkphp6接口文档", version="1.0.1")
 */

class Index extends BaseController
{
    /**
     * @OA\Get(path="/api/article",
     *   tags={"文章管理"},
     *   summary="文章列表",
     *   @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string", default="123456")),
     *   @OA\Parameter(name="page", in="query", description="页码", @OA\Schema(type="int", default="1")),
     *   @OA\Parameter(name="limit", in="query", description="行数", @OA\Schema(type="int", default="10")),
     *   @OA\Response(response="200", description="The User")
     * )
     */
    public function index()
    {
                return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V' . \think\facade\App::version() . '<br/><span style="font-size:30px;">14载初心不改 - 你值得信赖的PHP框架</span></p><span style="font-size:25px;">[ V6.0 版本由 <a href="https://www.yisu.com/" target="yisu">亿速云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ee9b1aa918103c4fc"></think>';

    }

    /**
     * @OA\Post(path="/api/article",
     *   tags={"文章管理"},
     *   summary="新增文章",
     *   @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string")),
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="multipart/form-data",
     *         @OA\Schema(
     *           @OA\Property(description="文章名称", property="title", type="string", default="dd"),
     *           @OA\Property(description="文章内容", property="content", type="string"),
     *           required={"title", "content"})
     *       )
     *     ),
     *   @OA\Response(response="200", description="successful operation")
     * )
     */
    public function save()
    {
        //save业务代码
    }

    /**
     * @OA\Get(path="/api/article/{id}",
     *   tags={"文章管理"},
     *   summary="文章详情",
     *   @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string")),
     *   @OA\Parameter(name="id", in="path", description="文章id", @OA\Schema(type="int")),
     *   @OA\Response(response="200", description="The User")
     * )
     */
    public function read($id)
    {
        //read业务代码
    }

    /**
     * @OA\Put(path="/api/article/{id}",
     *   tags={"文章管理"},
     *   summary="编辑文章",
     *   @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string")),
     *   @OA\Parameter(name="id", in="path", description="文章id", @OA\Schema(type="int")),
     *   @OA\RequestBody(
     *     @OA\MediaType(
     *       mediaType="content-type/json",
     *         @OA\Schema(
     *           @OA\Property(description="文章名称", property="title", type="string"),
     *           @OA\Property(description="文章内容", property="content", type="string"),
     *           required={"title", "content"})
     *       )
     *     ),
     *   @OA\Response(response="200", description="successful operation")
     * )
     */
    public function update($id)
    {
        //update业务代码
    }

    /**
     * @OA\Delete(path="/api/article/{id}",
     *   tags={"文章管理"},
     *   summary="删除文章",
     *   @OA\Parameter(name="token", in="header", description="token", @OA\Schema(type="string")),
     *   @OA\Parameter(name="id", in="path", description="文章id", @OA\Schema(type="int")),
     *   @OA\Response(response="200", description="The User")
     * )
     */
    public function delete($id)
    {
        //delete业务代码
    }
}

浏览器输入http://localhost:8000/swagger

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么通过Fiddler对APP进行抓包?以及高级应用场景分析

目录 前言 简单说下Fiddler的抓包原理&#xff1a; 使用fiddler代理远程捕获APP请求 Fiddler高级应用场景介绍 1、url地址重写 fiddler抓包详细教程&#xff1a;全网抓包天花板教程&#xff0c;B站讲的最详细的Fiddler/Charles抓包教学视频。2小时包你学会_哔哩哔哩_bilibi…

软件测试之路已不再是坦途

去年下半年才跳了槽&#xff0c;过程非常顺利&#xff0c;没有经历大家所说的工作荒的境地&#xff0c;所以一直没有直观地感受到软件测试就业形势到底有多严峻。 近来看到一些机构频频发出某某测试员在糟糕的就业形势下逆袭拿下XXW的某厂offer&#xff0c;然后推荐测试进阶课…

Django学习笔记-配置Docker、Git环境与项目创建

笔记内容转载自AcWing的Django框架课讲义&#xff0c;课程链接&#xff1a;AcWing Django框架课。 CONTENTS 1. 配置Docker环境2. Django项目创建3. Django App创建 1. 配置Docker环境 首先拉取一个 Ubuntu 镜像&#xff1a; docker pull ubuntu:20.04创建容器后进入容器配置…

Splunk:构建安全监控解决方案(第 1 部分)

在我的网络安全训练营的最后几周&#xff0c;我们的最终项目之一是使用 Splunk Enterprise 为一个名为 VSI&#xff08;虚拟空间工业&#xff09;的虚构组织构建安全监控环境&#xff0c;对于那些可能不知道的人来说&#xff0c;它是一个 SIEM&#xff08;安全信息和事件管理器…

科一容易忘、容易混的点——图类

注意行人 和 人行横道区别 注意行人&#xff1a;黄色&#xff0c;里面是什么就注意什么 人行横道&#xff1a;正方形 “不得” xxx 的 就选择 【正确】 点火开关 1、LOCK档&#xff1a;这是一个锁止档&#xff0c;功能是当除了防盗系统和车内小灯以外&#xff0c;电路是完全关…

【Redis应用】用户签到统计连续签到(三)

&#x1f697;Redis应用学习第三站~ &#x1f6a9;本文已收录至专栏&#xff1a;Redis技术学习 签到功能是我们非常常见的一个功能&#xff0c;几乎在每个app中都能碰到&#xff0c;让我们一起看看如何实现吧~ 一.BitMap用法引入 我们针对签到功能完全可以通过mysql来完成&am…

Python基于指定范围筛选并剔除Excel表格中的数据

本文介绍基于Python语言&#xff0c;读取Excel表格文件&#xff0c;基于我们给定的规则&#xff0c;对其中的数据加以筛选&#xff0c;将不在指定数据范围内的数据剔除&#xff0c;保留符合我们需要的数据的方法。 首先&#xff0c;我们来明确一下本文的具体需求。现有一个Exce…

【JavaScript】讲解JavaScript的基础知识并且配有案例讲解

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f381;JavaScript嵌入网页的方式 &#x1f354;a…

LVS--DR集群部署

LVS--DR集群 一、DR模式原理二、实验 一、DR模式原理 原理&#xff1a;首先负载均衡器接收到客户的请求数据包时&#xff0c;根据调度算法决定将请求发送给哪个后端的真实服务器&#xff08;RS&#xff09;。然后负载均衡器就把客户端发送的请求数据包的目标MAC地址改成后端真…

PCI Express架构概述

目录 1. PCIe 总线概述 2. PCIe 拓扑结构 3. PCIe 分层结构 4. PCIe 事务层类型 5. PCIe 配置和地址空间 1. PCIe 总线概述 PCIe&#xff08;Peripheral Component Interconnect Express&#xff09;是一种用于连接计算机内部硬件设备的高速串行总线。它是在PCI&#xff08…

在Windows 11 中安装和使用 WSL 2

文章目录 列出可安装的发行版/分发安装WSL 2常用命令显示帮助启动分发从powershell中退出分发关闭正在运行的分发立即终止所有正在运行的分发和 WSL 2轻型虚拟机。更新wsl 使用VSCode连接WSL设置代理换源WSL 与 Windows 11 共享文件导入、导出 WSL 发行版导出导入 安装Docker E…

Nacos架构与原理 - 总体架构

文章目录 Nacos 起源Nacos 定位Nacos 优势Nacos 生态Nacos 总体设计设计原则架构图用户层业务层内核层插件 小结 Nacos 起源 Nacos 在阿里巴巴起源于 2008 年五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;成长于十年双十⼀的洪峰考验&#xff…

【大数据之路1】Hadoop 入门

1. Hadoop 入门 1. 大数据概述1. 大数据相关说明2. Hadoop 及大数据生态圈3. Hadoop 核心组件4. Hadoop 生态圈5. 集群安装模式6. Hadoop 运行模式7. Hadoop 工作流程8. Hadoop 的推行策略9. 知识点 2. Hadoop 启动与服务名1. Hadoop&#xff08;HDFS/YARN&#xff09;启动2. H…

区间预测 | MATLAB实现基于QRCNN-BiGRU卷积双向门控循环单元多变量时间序列区间预测

区间预测 | MATLAB实现基于QRCNN-BiGRU卷积双向门控循环单元多变量时间序列区间预测 目录 区间预测 | MATLAB实现基于QRCNN-BiGRU卷积双向门控循环单元多变量时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRCNN-BiGRU卷积神经…

数据结构4:二叉树

目录 1.树概念及结构 1.1树的概念 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录结构&#xff09; 2.二叉树的概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3特殊的二叉树&#xff1a; 2.4 二叉树的性质 2.5二叉树的存储结构 1.顺序结构 …

如何用 10 种策略改进 ChatGPT 的人工智能

你是否曾有过和AI机器人交互无果的经历&#xff1f;或许只是因为提示语的问题&#xff01;想要ChatGPT/Bard/Bing Chat等AI机器人更智能、回应更高效? 必须学会AI提示语技巧&#xff01;本文将深入解析如何用精准的语言编写提示&#xff0c;让您的AI聊天机器人更进一步。 为什…

从买卖股票入手谈谈DP Table

动态规划问题主要就是要明确dp函数定义、搞清楚状态以及状态转移方程 构建DP思路解析 状态 188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; 对于股票&#xff0c;我们每天有三种选择 > buy, sell, hold 限制条件有 > 天数限制&#xff08;n&…

Java关键字abstract详解

abstract 1.可以用来修饰&#xff1a;类、方法 2.具体的&#xff1a; abstract修饰类&#xff1a;抽象类 抽象类不能实例化 抽象类中一定有构造器&#xff0c;便于子类实例化时调用&#xff08;涉及&#xff1a;子类对象实例化的全过程&#xff09;。 开发中&#xff0c;都会提…

(转载)基于蚁群算法的旅行商问题(TSP)求解(matlab实现)

蚁群算法(ant colony algorithm,ACA)是由意大利学者M.Dorigo等人于20世纪90年代初提出的一种新的模拟进化算法&#xff0c;其真实地模拟了自然界蚂蚁群体的觅食行为。M.Dorigo等人将其用于解决旅行商问题(traveling salesman problem,TSP),并取得了较好的实验结果。 近年来&am…

论文精读 —— Invisible Backdoor Attack with Sample-Specific Triggers

文章目录 带有样本特定触发器的隐形后门攻击论文信息论文贡献理解性翻译摘要1. 引言2. 相关工作2.1. 后门攻击2.2. 后门防御 3. 深入了解现有防御4. 样本特定的后门攻击&#xff08;SSBA&#xff09;4.1. 威胁模型4.2. 提出的攻击如何生成样本特定的触发器样本特定的后门攻击流…