问题
我正在尝试使用
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());
这给出了预期的输出。
我认为您遇到了这个问题: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) 更具可扩展性:)