Swagger UI 不显示接口主因是未启用注解扫描或注解位置错误;需用 zircote/swagger-php v4+ 扫描控制器方法,确保路由引用、路径配置正确,且避免闭包路由。

为什么 @OA\Get 写了但 Swagger UI 里没出现接口?
常见原因是没启用自动扫描,或注解没放在 Laravel 能解析到的位置。Laravel 默认不扫描注解,必须靠第三方包(如 @zircote/swagger-php)配合命令行生成 JSON,再由前端(如 Swagger UI 或 Redoc)加载。
实操建议:
- 确保安装的是支持 OpenAPI 3.0+ 的
zircote/swagger-phpv4+(v3 不兼容 Laravel 9+ 的 PHP 8.1+ 属性语法) - 注解必须写在控制器方法上方,且该控制器被路由文件引用(否则扫描器找不到)
- 运行生成命令前,确认
app/Http/Controllers在swagger-php的扫描路径中,例如:php vendor/bin/openapi --format json --output storage/api-docs/openapi.json app/Http/Controllers
- 别把注解写在闭包路由里——
Route::get('/', fn() => ...)这类写法无法被静态分析捕获
@OA\Parameter 怎么标 Query 和 Path 参数才不报错?
OpenAPI 规范对参数位置(in)和定义方式很敏感,写错会导致 JSON 生成失败或 UI 渲染异常。尤其注意 Laravel 的资源路由(如 {user})需要显式声明 in="path",不能只靠占位符推断。
实操建议:
- Path 参数必须带
required=true和in="path",例如:@OA\Parameter(name="id", in="path", required=true, @OA\Schema(type="integer"))
- Query 参数用
in="query",即使 Laravel 中用request()->query('page')获取,也得显式标注 - 不要混用
@OA\Property和@OA\Schema:参数类型统一用@OA\Schema,对象结构才用@OA\Property嵌套 - 数组型 query(如
?tag[]=a&tag[]=b)需写成@OA\Schema(type="array", @OA\Items(type="string")),不是type="string[]"
如何让 @OA\Response 正确显示 Eloquent 模型结构?
直接写 @OA\Schema(ref="#/components/schemas/User") 是常见做法,但 ref 路径必须与实际生成的 components 匹配,否则 Swagger UI 显示 “schema not found”。Laravel 模型本身不含 OpenAPI 元数据,得手动建 Schema 或用 trait 注入。
实操建议:
- 避免在每个
@OA\Response里重复写完整模型字段,改用@OA\Schema(ref="#/components/schemas/User")+ 单独定义@OA\Schema(schema="User", ...)(放在任意可扫描的 PHP 文件顶部或专用 doc 目录) - 如果模型有访问器(accessor)或隐藏字段(
$hidden),Schema 必须手动同步,注解不会自动读取模型配置 - 分页响应(如
LengthAwarePaginator)不能只标@OA\Schema(type="array"),得定义外层结构:@OA\Schema(@OA\Property(property="data", type="array", @OA\Items(ref="#/components/schemas/User")), @OA\Property(property="links", type="object"))
- 使用
@OA\Examples补充真实返回示例,比纯类型描述更利于前端理解
部署后 openapi.json 404 或内容过期怎么办?
生成的 openapi.json 是静态文件,Laravel 不会自动更新它。开发时每次改接口都得手动重跑命令;生产环境若没加构建步骤,文档就永远停留在首次部署状态。
实操建议:
- 把生成命令加入 Composer
post-autoload-dump或部署脚本(如 Envoyer、Deployer 的deploy:updated钩子) - JSON 文件别放
public/下直接暴露,推荐存storage/api-docs/openapi.json,然后加一条路由转发:Route::get('/docs/openapi.json', function () { return response()->file(storage_path('api-docs/openapi.json')); }); - 加缓存头防止 CDN 缓存旧版:
->header('Cache-Control', 'no-cache, no-store, must-revalidate') - CI/CD 中检查生成结果是否为空(
jq '.paths | keys | length' storage/api-docs/openapi.json应 > 0),避免静默失败
最难的不是写注解,而是让注解和代码始终同步——尤其是当团队里有人改了 API 但忘了动 @OA\ 标签时,文档就变成了“可信度存疑的考古资料”。建议把生成命令接入 PR 检查,哪怕只校验 JSON 是否能 parse,也能拦住明显断裂。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











