首页
/ 在Scribe文档工具中实现OpenAPI标签分组功能

在Scribe文档工具中实现OpenAPI标签分组功能

2025-07-05 13:55:00作者:钟日瑜

背景介绍

Scribe是一个流行的API文档生成工具,它能够自动从Laravel应用中生成美观的API文档。在实际项目中,随着API数量的增加,合理的分组和分类变得尤为重要。OpenAPI规范支持通过标签(tags)和标签组(tagGroups)来组织API端点,这可以显著提升文档的可读性和导航体验。

需求分析

许多开发者希望在Scribe生成的OpenAPI文档中实现多级导航功能,类似于Elements主题提供的体验。具体来说,需要实现以下功能:

  1. 为API端点添加子组(subgroup)信息
  2. 在生成的OpenAPI规范中包含x-tagGroups扩展字段
  3. 保持与现有Scribe功能的兼容性

技术实现方案

自定义OpenAPI规范写入器

通过继承Scribe的OpenAPISpecWriter类,我们可以自定义OpenAPI规范的生成逻辑。核心思路是:

  1. 从端点元数据中提取子组信息
  2. 构建标签列表
  3. 组织标签组结构
  4. 将自定义内容合并到标准OpenAPI规范中

关键代码实现

class CustomOpenAPISpecWriter extends OpenAPISpecWriter
{
    public function generateSpecContent(array $groupedEndpoints): array
    {
        // 准备标签列表
        $tags = [];
        foreach ($groupedEndpoints as $group) {
            foreach ($group['endpoints'] as $endpoint) {
                $subgroup = $endpoint['metadata']['subgroup'];
                if (!in_array($subgroup, $tags)) {
                    $tags[] = $subgroup;
                }
            }
        }

        // 准备标签组结构
        $tagGroups = [];
        foreach ($groupedEndpoints as $group) {
            $groupTags = [];
            foreach ($group['endpoints'] as $endpoint) {
                $subgroup = $endpoint['metadata']['subgroup'];
                if (!in_array($subgroup, $groupTags)) {
                    $groupTags[] = $subgroup;
                }
            }
            $tagGroups[] = [
                'name' => $group['name'],
                'tags' => $groupTags,
            ];
        }

        return array_merge([
            // 标准OpenAPI字段
            'openapi' => self::SPEC_VERSION,
            'info' => [...],
            'servers' => [...],
            'paths' => $this->generatePathsSpec($groupedEndpoints),
            
            // 自定义标签相关字段
            'tags' => array_map(function ($tag) {
                return [
                    'name' => $tag,
                    'description' => 'Description for '.$tag,
                ];
            }, $tags),
            'x-tagGroups' => $tagGroups,
        ], $this->generateSecurityPartialSpec());
    }
}

注册自定义写入器

在Laravel服务提供者中注册自定义写入器:

$this->app->bind(OpenAPISpecWriter::class, CustomOpenAPISpecWriter::class);

实现效果

通过这种实现方式,生成的OpenAPI文档将包含:

  1. 详细的标签定义
  2. 分层次组织的标签组结构
  3. 完整的API端点信息

这使得生成的文档在支持x-tagGroups的查看器(如Scalar)中能够显示多级导航菜单,大大提升了API文档的可用性。

最佳实践建议

  1. 为每个子组提供有意义的描述信息
  2. 保持分组层次不超过3级以确保可读性
  3. 考虑在API端点元数据中添加分组信息的验证逻辑
  4. 为自定义写入器添加单元测试确保稳定性

总结

通过扩展Scribe的OpenAPI规范生成逻辑,我们成功实现了API文档的多级分组功能。这种方案不仅保持了与现有Scribe功能的兼容性,还显著提升了生成文档的组织结构和用户体验。这种自定义方法展示了Scribe框架良好的扩展性,开发者可以根据项目需求灵活调整文档生成逻辑。

对于需要更复杂文档组织的项目,还可以考虑进一步扩展这个方案,例如支持动态分组、基于权限的文档过滤等功能,这些都可以通过类似的自定义写入器方式实现。

登录后查看全文
热门项目推荐

热门内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
178
262
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
867
513
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
265
305
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
598
57
GitNextGitNext
基于可以运行在OpenHarmony的git,提供git客户端操作能力
ArkTS
10
3