$ref "#/components/responses/" 未找到 @OA\Response(响应=200)
$ref "#/components/responses/" not found for @OA\Response(response=200)
我正在尝试在 Laravel 项目中实现 openAPI 文档。我正在使用 darkaonline/l5-swagger package, which is built on top of swagger-php 生成文档。我遇到了参考问题。我想将 API 调用的响应导出到我正在记录的控制器外部的外部文件,为此我使用了引用。但是,在这个特定的项目中,我在生成文档时遇到了这个烦人的错误:
基于运行:
php artisan l5-swagger:generate
我得到以下输出
$ref "#/components/responses/" not found for @OA\Response(response=201) in \App\Http\Controllers\Organization\OrganizationController->get() in /data/www/nnaydenov/laravel-sandbox/app/Http/Controllers/Organization/OrganizationController.php on line 58
at vendor/zircote/swagger-php/src/Loggers/DefaultLogger.php:31
27▕ } else {
28▕ $error_level = E_USER_WARNING;
29▕ }
30▕
➜ 31▕ trigger_error($message, $error_level);
32▕ }
33▕ }
34▕
+33 vendor frames
34 artisan:37
Illuminate\Foundation\Console\Kernel::handle()
这是我的控制器:
class OrganizationController extends Controller
{
/**
* @OA\Get(
* path="second-example",
* operationId="secondExample",
* @OA\Response(
* response=200,
* description="Hello from my awesome description",
* @OA\JsonContent(
* @OA\Property(
* property="foo",
* type="string",
* example="bar",
* )
* )
* ),
* @OA\Response(
* ref="#/components/responses/foo",
* response=201
* )
* )
*/
public function get($id = null)
{
// ...
}
}
这是包含响应的文件,我想参考一下。它位于 app/Something/SomethingElse:
<?php
/**
* @OA\Response(
* response="foo",
* description="Sample description",
* @OA\JsonContent(
* @OA\Property(
* property="foo",
* type="string",
* example="bar",
* )
* )
* )
*/
顶级注释,位于app\Http\Controllers\Controller:
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
/**
* @OA\Info(
* version="1.0.0",
* title="Api documentation",
* description="Api documentation",
* @OA\Contact(
* email="admin@admin.com"
* ),
* @OA\License(
* name="Apache 2.0",
* url="http://www.apache.org/licenses/LICENSE-2.0.html"
* )
* )
*
* @OA\Server(
* url=L5_SWAGGER_CONST_HOST,
* description="Demo API Server"
* )
*
* @OA\Tag(
* name="Projects",
* description="API Endpoints of Projects"
* )
*/
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
// ...
}
我想这个项目有问题,我正在尝试实现它,因为相同的代码在一个普通的 Laravel 8 项目中工作。但是,我不知道如何调试这个问题。我尝试使用
手动创建 openapi.json 文件
./vendor/bin/openapi . -o openapi.json
但这会导致许多错误,我还没有设法修复。关于此错误的可能原因或如何调试的任何建议?
如果这是一个新项目,很可能您现在正在使用 swagger-php V4。
在版本 4 中,分析器代码使用反射。这样做是为了可以使用注释或 PHP 8 个属性。
一个缺点是不再检测到 stand-alone 文档块,因为没有反射来访问它们。
解决此问题的最简单方法是在注释后添加 class FooResponse{}
行,swagger-php 应该会再次找到它。
这同样适用于其他顶级注释,如 @OA\Info
或其他。
我正在尝试在 Laravel 项目中实现 openAPI 文档。我正在使用 darkaonline/l5-swagger package, which is built on top of swagger-php 生成文档。我遇到了参考问题。我想将 API 调用的响应导出到我正在记录的控制器外部的外部文件,为此我使用了引用。但是,在这个特定的项目中,我在生成文档时遇到了这个烦人的错误:
基于运行:
php artisan l5-swagger:generate
我得到以下输出
$ref "#/components/responses/" not found for @OA\Response(response=201) in \App\Http\Controllers\Organization\OrganizationController->get() in /data/www/nnaydenov/laravel-sandbox/app/Http/Controllers/Organization/OrganizationController.php on line 58
at vendor/zircote/swagger-php/src/Loggers/DefaultLogger.php:31
27▕ } else {
28▕ $error_level = E_USER_WARNING;
29▕ }
30▕
➜ 31▕ trigger_error($message, $error_level);
32▕ }
33▕ }
34▕
+33 vendor frames
34 artisan:37
Illuminate\Foundation\Console\Kernel::handle()
这是我的控制器:
class OrganizationController extends Controller
{
/**
* @OA\Get(
* path="second-example",
* operationId="secondExample",
* @OA\Response(
* response=200,
* description="Hello from my awesome description",
* @OA\JsonContent(
* @OA\Property(
* property="foo",
* type="string",
* example="bar",
* )
* )
* ),
* @OA\Response(
* ref="#/components/responses/foo",
* response=201
* )
* )
*/
public function get($id = null)
{
// ...
}
}
这是包含响应的文件,我想参考一下。它位于 app/Something/SomethingElse:
<?php
/**
* @OA\Response(
* response="foo",
* description="Sample description",
* @OA\JsonContent(
* @OA\Property(
* property="foo",
* type="string",
* example="bar",
* )
* )
* )
*/
顶级注释,位于app\Http\Controllers\Controller:
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
/**
* @OA\Info(
* version="1.0.0",
* title="Api documentation",
* description="Api documentation",
* @OA\Contact(
* email="admin@admin.com"
* ),
* @OA\License(
* name="Apache 2.0",
* url="http://www.apache.org/licenses/LICENSE-2.0.html"
* )
* )
*
* @OA\Server(
* url=L5_SWAGGER_CONST_HOST,
* description="Demo API Server"
* )
*
* @OA\Tag(
* name="Projects",
* description="API Endpoints of Projects"
* )
*/
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
// ...
}
我想这个项目有问题,我正在尝试实现它,因为相同的代码在一个普通的 Laravel 8 项目中工作。但是,我不知道如何调试这个问题。我尝试使用
手动创建 openapi.json 文件./vendor/bin/openapi . -o openapi.json
但这会导致许多错误,我还没有设法修复。关于此错误的可能原因或如何调试的任何建议?
如果这是一个新项目,很可能您现在正在使用 swagger-php V4。 在版本 4 中,分析器代码使用反射。这样做是为了可以使用注释或 PHP 8 个属性。
一个缺点是不再检测到 stand-alone 文档块,因为没有反射来访问它们。
解决此问题的最简单方法是在注释后添加 class FooResponse{}
行,swagger-php 应该会再次找到它。
这同样适用于其他顶级注释,如 @OA\Info
或其他。