zircote/swagger-php - 跳过未知的 La\Product

问题描述 投票:0回答:1

问题

我正在尝试使用

zircote/swagger-php
从 PHP 代码生成 OpenApi 文件。由于某种原因,我不断收到以下错误:

Warning: Skipping unknown La\Product
Warning: Required @OA\PathItem() not found
Warning: Required @OA\Info() not found

设置

我正在使用 Docker 容器来使其可重现。我的设置如下:

.
├── Dockerfile
├── project
│   └── myTest.php
└── swagger.php

这是文件的内容:

Dockerfile

FROM composer:latest
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN ["composer", "require", "zircote/swagger-php"]
RUN ["composer", "require", "doctrine/annotations"]
CMD ["sh"]

在我运行的容器内:

./vendor/bin/openapi project/

项目/myTest.php

<?php

namespace La;
use OpenApi\Annotations as OA;

/**
 * @OA\Info(title="My First API", version="0.1")
 * @OA\Get(
 *    path="/",
 *    @OA\Response(response="200", description="Some description.")
 * )
 */
#[SomeAttribute]
class Product {
    /**
     * @OA\Get(
     *     path="/api/data.json",
     *     @OA\Response(
     *         response="200",
     *         description="The data"
     *     )
     * )
     */
    public function getResource()
    {
        // ...
    }
    public $la = 12;
}

swagger.php

<?php

require("vendor/autoload.php");
$openapi = \OpenApi\Generator::scan(['project']);
header('Content-Type: application/x-yaml');
echo $openapi->toJson();

产生与上面运行命令行命令相同的错误。

已经尝试过

我尝试了几个教程和示例,具有相同的输出,只是跳过了不同的命名空间和类名。

我已经看到here这一切都归结为自动加载和反射,但它没有给我任何实际的提示要做什么。

我还在 github 上的一些评论中看到降级到 php 8.1 有帮助,但这对我来说不起作用。经过大量摆弄 Dockerfile 后,它归结为完全相同的错误。

这个问题也没有帮助。似乎非常特定于 Laravel。

建议here只设置一个虚拟类,会产生几乎相同的错误,但没有跳过任何类。

为了确保我没有遇到真正愚蠢的事情,我验证了反射正在使用此代码:

<?php

require './project/myTest.php';

$reflector = new ReflectionClass('La\Product');

$t = new La\Product();
echo $t->la . "\n";

var_dump($reflector->getProperties());
echo "\n";

print_r(array_map(fn($att) => $att->getName(), $reflector->getAttributes()));

var_dump( $reflector->getDocComment());

这给出了预期的输出。

php swagger openapi swagger-php
1个回答
0
投票

我认为您遇到了这个问题:https://zircote.github.io/swagger-php/guide/faq.html#skipping-unknown-someclass

除了自动加载之外,您几乎已经完成了所有正确的操作。事实上,在您的手动示例中,出于同样的原因,您实际上已经明确

require
了测试类文件 - 需要加载该类才能使反射工作。

有两种方法可以让这个基本测试发挥作用

a) 将

myTest.php
添加为 CL 的引导选项 这将为您完成
require
,就像在您的测试代码中一样。

./vendor/bin/openapi -b project/myTest.php project/

b) 设置作曲家自动加载。 您的设置中似乎没有composer.json。我想类似的事情

{
    "require": {
        "zircote/swagger-php": "^4.8",
        "doctrine/annotations": "^2.0"
    },
   "autoload": {
        "psr-4": {
            "project\\": "La/"
        }
    }
}

应该可以。也意味着您可以将 Dockerfile 更改为单个 Composer 命令:

RUN ["composer", "install"]

应该清楚的是,选项 (b) 更具可扩展性:)

© www.soinside.com 2019 - 2024. All rights reserved.