详细了解Laravel Swagger的使用

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了swagger使用的相关问题,下面一起来看一看基于laravel 生成swagger 为例子,希望对大家有帮助。

详细了解Laravel Swagger的使用

【相关推荐:laravel视频教程】

swagger太辣鸡了?

本教程是基于Laravel 生成swagger 为例子,其实这个东西和语言或者和框架基本没啥区别,因为都是用的公用的json ,通过程序扫描swagger预先规定的“语言”,生成结构存入json中,通过 swagger ui 展现出来(或者自己开发)。

对于php开发人员来说,有大部分同学很不喜欢swagger。 因为这个看上去写起来好麻烦啊,一想到分分钟用php写完的代码,写swagger要写10分钟,心里就抵触这个东西。

身边有Java开发的同学就知道他们很大一部分都用swagger,因为java要维护数据结构,而且swagger在java整合得更灵活。

这个时候java如果看到有php 说swagger反人类的东西,太麻烦了,上古时代的产物。那身边的java朋友会心里窃喜,这么好用的东西都不用,还说php是世界上最好的语言。

我为啥用swagger

最近在写自动生成代码,其实现在Laravel 很多自动生成CURD的。比如像laravel-admin ,一条命令生成CURD,但是生成之后,数据看上去很冷。 比如有一些字段不需要显示,有一些是要select关联枚举的,有一些是 hasMany的,还有 overtrue(正超)的api脚手架也挺好的

所以swaager也可以根据业务需求写自动化生成

L5-Swagger

https://github.com/DarkaOnLine/L5-Swagger

安装:

composer require "darkaonline/l5-swagger"

使用:

php artisan vendor:publish --provider "L5SwaggerL5SwaggerServiceProvider"php artisan l5-swagger:generate

填写下面例子生成之后再访问

/api/documentation

@OAInfo 为必须

例子

/** * @OAInfo( *      version="1.0.0", *      title="L5 OpenApi", *      description="L5 Swagger OpenApi description", *      @OAContact( *          email="darius@matulionis.lt" *      ), *     @OALicense( *         name="Apache 2.0", *         url="http://www.apache.org/licenses/LICENSE-2.0.html" *     ) * ) */

get 请求

如果要匹配path中的数值则 in path 查询 in query

/** * @OAGet( *      path="/projects/{id}", *      operationId="getProjectById", *      tags={"Projects"}, *      summary="Get project information", *      description="Returns project data", *      @OAParameter( *          name="id", *          description="Project id", *          required=true, *          in="path", *          @OASchema( *              type="integer" *          ) *      ), *      @OAResponse( *          response=200, *          description="successful operation" *       ), *      @OAResponse(response=400, description="Bad request"), *      @OAResponse(response=404, description="Resource Not Found"), *      security={ *         { *             "oauth2_security_example": {"write:projects", "read:projects"} *         } *     }, * ) */

POST 请求

                  /**     * @OAPost(     *      path="/api/test/store",     *      operationId="api/test/store",     *      tags={"Test"},     *      summary="Test创建",     *      description="Test提交创建",     *      @OAParameter(     *          name="id",     *          description="",     *          required=false,     *          in="query",     *      ),     *     @OAResponse(     *         response=200,     *         description="successful operation",     *         @OAJsonContent(     *         ref="#/components/schemas/Test"     *         )     *     ),     *      @OAResponse(response=400, description="Bad request"),     *      @OAResponse(response=404, description="Resource Not Found"),     *      security={     *         {     *             "api_key":{}     *         }     *     },     * )     */

文件上传参数

     *     @OARequestBody(     *       @OAMediaType(     *           mediaType="multipart/form-data",     *           @OASchema(     *               type="object",     *               @OAProperty(     *                  property="file",     *                  type="file",     *               ),     *           ),     *       )     *     ),

传入为枚举

     *     @OAParameter(     *         name="status",     *         in="query",     *         description="状态",     *         required=true,     *         explode=true,     *         @OASchema(     *             type="array",     *             default="available",     *             @OAItems(     *                 type="string",     *                 enum = {"available", "pending", "sold"},     *             )     *         )     *     ),

Body 为Json 方式提交

     *     @OARequestBody(     *         @OAMediaType(     *             mediaType="application/json",     *             @OASchema(     *                 @OAProperty(     *                     property="id",     *                     type="string"     *                 ),     *                 @OAProperty(     *                     property="name",     *                     type="string"     *                 ),     *                 example={"id": 10, "name": "Jessica Smith"}     *             )     *         )     *     ),

在这里插入图片描述

使用结构Schema作为请求参数

     *     @OARequestBody(     *         description="order placed for purchasing th pet",     *         required=true,     *         @OAJsonContent(ref="#/components/schemas/UserModel")     *     ),

Schema的使用

/** * @OASchema( *      schema="UserModel", *      required={"username", "age"}, *      @OAProperty( *          property="username", *          format="string", *          description="用户名称", *          example="小廖", *      ), *      @OAProperty( *          property="age", *          format="int", *          description="年龄", *          example=1, *          nullable=true, *      ) * ) */

枚举

一个枚举单独创建一个Schema

/** * @OASchema( *   schema="product_status", *   type="string", *   description="The status of a product", *   enum={"available", "discontinued"}, *   default="available" * ) */

映射到模型中的具体字段

 *      @OAProperty( *     property="status", *     ref="#/components/schemas/product_status" *      ),

这样前端开发者就可以

关联模型

和枚举差不多,通过一个Property关联模型

 *      @OAProperty( *     property="user_detail", *     ref="#/components/schemas/UserModel2" *      ),

关联模型和枚举,可以自动生成请求的参数和,返回的结构
在这里插入图片描述

返回为模型结构

     *     @OAResponse(     *         response=200,     *         description="successful operation",     *         @OAJsonContent(     *             type="array",     *             @OAItems(ref="#/components/schemas/UserModel"),     *             @OAItems(ref="#/components/schemas/UserModel2")     *         )     *     ),

就比如那天前端小妹跟你说,哥哥,支付状态3代表什么,可能你很快的说出了是某某状态,但是问你11是啥状态,人都要沙雕了。
通过swagger 的Schema 能让前端人员摸清后端的结构信息,比如:

在这里插入图片描述

各位,这些都可以自动化编程,自动生成的,工作效率不要太爽

多个合并Schema

/** * @OASchema( *   schema="UserModel", *   allOf={ *     @OASchema(ref="#/components/schemas/UserModel2"), *     @OASchema( *       type="object", *       description="Represents an authenticated user", *       required={ *         "email", *         "role", *       }, *       additionalProperties=false, *       @OAProperty( *         property="email", *         type="string", *         example="user@example.com", *         nullable=true, *       ), *     ) *   } * ) */

验证提供outh2 和apikey 两种方式,在存放全局配置中写入(也可以任意目录中)

/** * @OASecurityScheme( *     type="apiKey", *     in="query", *     securityScheme="api_key", *     name="api_key" * ) */

在接口中添加

security={{"api_key": {}}},

这时,swagger Ui 会出现一个锁一样的东西

在这里插入图片描述

可以输入自己的token,请求的时候会带上token

在这里插入图片描述
可以结合 Laravel 的自带token验证,可以参考之前写的文章 Laravel guard 菊花守卫者

更多使用方法可以查看官网例子: https://github.com/zircote/swagger-php/tree/master/Examples/petstore-3.0

可能遇到的问题

线上环境如果访问不了,可能是你nginx 配置的问题,因为,laravel-swagger 是通过file_content_get() 的方式 echo 输出js 的。而你的nginx 配置判断,如果是 .js 或者css 是静态文件,所以到不了index.php ,更执行不了 file_content_get 函数了。可以参考nginx 配置:

charset utf-8;client_max_body_size 128M;location / {try_files $uri $uri/ /index.php$is_args$args;}location ~ .php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass  php74:9000 这个换成你自己的;try_files $uri =404;}

【相关推荐:laravel视频教程】

以上就是详细了解Laravel Swagger的使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/70633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月13日 06:44:12
下一篇 2025年11月13日 07:08:38

相关推荐

  • RSS如何实现分页加载?

    RSS协议本身不支持分页,因其设计为一次性推送最新内容;可通过服务器端动态生成带页码参数的Feed链接,或创建多个独立的历史存档Feed来模拟分页效果,但主流阅读器通常只订阅主URL,难以自动加载多页内容。 RSS本身的设计初衷,其实并没有直接内置“分页”这个概念。它更像是一个新闻快讯的广播台,一次…

    2025年12月17日
    000
  • RSS怎样处理动态参数?

    rss本身不支持动态参数,但可通过后端实现动态内容。1.创建多个独立rss源,按分类或标签生成不同订阅地址;2.利用服务器端逻辑解析url参数,动态筛选内容生成对应xml;3.确保每个item的指向规范url;4.引入缓存机制提升性能,如缓存特定标签的rss内容;5.通过html头部标签和订阅页面增…

    2025年12月17日
    000
  • GolangWeb表单验证与输入校验实践

    Golang无内置表单验证因遵循“显式优于隐式”哲学,需依赖结构体绑定与第三方库(如validator)实现声明式验证,并结合手动清理确保安全;通过分离绑定、验证与清理步骤,提升代码可维护性,同时利用ValidationErrors返回具体错误信息以优化用户体验,配合HTML转义、参数化查询等手段完…

    2025年12月15日 好文分享
    000
  • 现代软件开发中的语言选择策略:PHP、GoLang与多语言栈的构建

    本文探讨了在Web、桌面及高性能应用开发中,如何权衡PHP、GoLang等编程语言的选择。面对快速开发与极致性能的需求,没有单一“完美”语言。教程强调应充分利用PHP在Web领域的现有优势,并通过C/C++等语言弥补性能短板,同时根据具体平台(桌面、移动)选择最合适的工具,构建灵活高效的多语言技能栈…

    2025年12月15日
    000
  • PHP与Go-lang抉择:构建高效多平台应用的语言策略

    在编程语言选择上,没有一劳永逸的“完美”方案。本文探讨了在Web开发中继续利用PHP的优势,并结合C/C++处理性能瓶颈的策略。同时,针对桌面和移动应用,提出了基于特定平台和性能需求的语言选择建议,强调采用多语言、多技术栈的综合方法来应对多样化的开发挑战。 Web开发:PHP的持续价值与性能优化 对…

    2025年12月15日
    000
  • Laravel在Debian上如何备份数据

    在debian系统上如何备份laravel项目的数据?以下是详细的步骤和脚本示例: 数据库备份:根据你使用的数据库类型,使用mysqldump或pg_dump进行备份。存储目录备份:将Laravel的storage目录,包括文件、缓存、日志等,备份到安全位置。环境配置文件备份:确保备份.env文件,…

    2025年12月15日
    000
  • EMQX、Go-Gin设备通信:认证、指令发送及业务处理如何实现?

    EMQX、Go-Gin 与物联网设备通信:安全机制与业务流程 本文阐述如何利用 EMQX MQTT 服务器和 Go-Gin 框架构建高效安全的物联网设备通信系统,涵盖设备认证、指令分发和业务逻辑处理三个关键环节。 一、统一认证机制:EMQX 与 HTTP API 的 JWT Token 共享 EMQ…

    2025年12月15日
    000
  • EMQX与Golang-Gin集成:如何实现高效安全的MQTT认证及业务处理?

    EMQX和Golang-Gin框架集成:实现高效安全的MQTT认证与业务逻辑处理 本文阐述如何结合EMQX MQTT消息服务器和Golang-Gin框架,构建高效安全的MQTT认证和业务处理流程。我们将围绕三个核心问题展开:如何利用JWT令牌在EMQX和HTTP服务间实现统一认证?如何向EMQX中的…

    2025年12月15日
    000
  • php中的codeIgniter框架是什么?

    CodeIgniter 因轻量、易上手、高效和灵活被广泛使用,适合初学者和小型项目。其详细文档和简洁语法降低学习门槛,无需复杂工具即可运行;核心小、加载快,资源消耗低;支持按需使用组件,不强制结构;内置数据库操作、表单验证等功能,开箱即用;采用 MVC 架构,分离数据、界面与逻辑,提升可维护性;常用…

    2025年12月14日
    000
  • php中Larave框架中间件是什么?

    中间件是Laravel中用于过滤HTTP请求的机制,可在请求到达控制器前后执行逻辑。1. 可实现身份认证、权限控制、日志记录和安全防护等功能;2. Laravel内置auth、csrf等中间件,也可通过php artisan make:middleware自定义;3. 可在路由或控制器构造函数中绑定…

    2025年12月14日
    000
  • php与python建站的区别有哪些

    PHP专为Web开发设计,适合快速建站,如用WordPress搭建内容类网站;Python是通用语言,适合复杂应用及AI等扩展。1. PHP语法嵌入HTML方便,Python通过Django/Flask实现模块化开发。2. PHP生态有成熟CMS,开发效率高;Python框架功能强,适合数据处理与全…

    2025年12月14日
    000
  • 构建双服务器通信:Laravel 与 Python Flask 的异步请求处理

    本文旨在解决 Laravel 服务器和 Python Flask 服务器之间进行双向通信时,避免阻塞连接的问题。通过探讨传统 HTTP 服务器的局限性,介绍了使用异步编程模型(如 asyncio 和 aiohttp)来优化服务器性能的方法。文章将重点讲解如何在 Flask 框架中利用异步特性,以及如…

    2025年12月14日
    000
  • 使用异步请求在 Laravel 和 Flask 服务器之间进行通信

    本文档介绍了如何在 Laravel (PHP) 和 Flask (Python) 服务器之间实现非阻塞的双向请求通信。传统 HTTP 服务器的线程模型限制了并发处理能力,当一个服务器需要等待另一个服务器的响应时,会阻塞当前线程。本文将探讨使用异步编程解决此问题的方法,重点介绍如何在 Flask 中利…

    2025年12月14日
    000
  • 使用异步方式在 Laravel 和 Flask 服务器之间进行通信

    本文档介绍了如何在 Laravel 和 Python Flask 服务器之间实现非阻塞的请求通信。针对机器学习任务,Flask 服务器需要从 Laravel 服务器获取最新数据,传统同步方式会阻塞连接。本文将探讨使用异步编程解决此问题,重点介绍 asyncio 和 aiohttp,并提供示例代码和注…

    2025年12月14日
    000
  • 实现服务器间非阻塞通信:Python Flask与Laravel的异步交互策略

    本文探讨了在Python Flask和Laravel服务器之间进行数据交互时,如何避免传统阻塞式请求导致的性能瓶颈。核心解决方案是采用异步I/O模型,特别是利用Python的asyncio和aiohttp库,或支持异步的Web框架(如Flask 3.0+或Starlette),以实现服务器线程在等待…

    2025年12月14日
    000
  • 使用异步请求在 Laravel 和 Flask 服务器间进行通信

    本文探讨了如何在 Laravel 和 Python Flask 服务器之间实现非阻塞的请求通信。传统的 HTTP 服务器模型在处理请求时会阻塞线程,影响性能。本文介绍了两种解决方案:使用多线程/进程,以及采用异步服务器架构。重点讲解了如何利用 asyncio 和 aiohttp 等库,将 Flask…

    2025年12月14日
    000
  • 如何进行数据库迁移(Migration)?

    数据库迁移的核心理念是“结构演进的版本控制”,即通过版本化、可追踪、可回滚的方式管理数据库Schema变更,确保团队协作中数据库结构的一致性。它关注的是表结构、索引、字段等“骨架”的变化,如添加字段或修改列类型,强调与应用代码迭代同步。而数据迁移则聚焦于“血肉”,即数据内容的转移、清洗、转换,例如更…

    2025年12月14日
    000
  • Python数据库操作:必须使用对象映射吗?

    Python数据库操作:灵活选择,无需拘泥于对象映射 学习Python数据库操作时,你可能会接触到SQLAlchemy、MongoDB等ORM框架。许多初学者都会问:Python数据库操作必须依赖对象映射吗?面对数百张数据库表,难道要创建同样数量的对象文件?本文将解答这些疑问,并探讨Python数据…

    2025年12月13日
    000
  • Python数据库操作:ORM映射是唯一途径吗?

    Python数据库操作:灵活选择,ORM并非唯一 许多Python开发者在使用Flask框架和数据库驱动(如SQLAlchemy或PyMongo)时,常常纠结于数据库操作是否必须进行ORM(对象关系映射)。本文将结合代码示例,阐明Python数据库操作的灵活性和多种途径。 问题在于,SQLAlche…

    2025年12月13日
    000
  • Python数据库操作:必须使用ORM吗?

    Python数据库操作:ORM并非唯一选择 许多Python开发者习惯使用ORM(对象关系映射)工具,例如SQLAlchemy,来操作数据库。 但一个常见问题是:是否必须为每个数据库表都创建对应的ORM映射?尤其面对大量表时,这种方法显得冗余且效率不高,与PHP框架(如Laravel)直接使用SQL…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信