当前位置: 首页 > 知识库问答 >
问题:

在Api平台/OpenApi中使用本机枚举

禄仲渊
2023-03-14

我正在学习带有 Api-Platform 的 OpenApi/Swagger API。我创建了一个新的endpoint,它接受枚举的值作为参数:

#[ApiResource(
itemOperations: [
    'get_by_name' => [
        'openapi_context' => [
            ....
            'parameters' => [
                [
                    'in' => 'header',
                    'name' => 'X-Server-Region',
                    'schema' => [
                    'type' => 'string',
                    'enum' => ['server1', 'server2'],
                    'example' => 'server1',
                 ],
                 'description' => 'Server to select',
                 'required' => true
             ],
...
)]

然而,这是一个相当常见的参数,值可以频繁更新(随着服务器的增加),我想使用某种模板。

所以我试着:

<?php

namespace App\Enum;

enum Server: string
{
    case SERVER1 = 'server1';
    case SERVER2 = 'server2';
    ...
}

'enum' => [...Server::cases()],

或者

'enum' => [Server::class],

以及其他各种形式,都无济于事。

我试图理解组件的概念,但无法找到在Symfony/Api平台中使用它们的方法。

如何在不同的endpoint重用枚举?

共有2个答案

乐宜民
2023-03-14

要在 Enum 支持可用之前暂时解决问题,您可以创建一个包含数据原型的类,以便在 API 中重用它。这样,您可以重复使用相同的数据集,而无需复制它。这将使您将来的工作更轻松。

所以你创建了一个数据的原型,像这样:

    class  Server
    {
        public const  PROTOTYPE = [ 'select1', 'select2', 'select3'];
    }

导入类,然后在注释中调用它,如下所示:

'enum' => Server::PROTOTYPE,
管景天
2023-03-14

枚举对于PHP来说是相当新的,Api平台还没有直接支持它们。

支持将会到来,但目前您必须在配置上手动明确列出每种情况。

虽然您也可以将“cases”列表存储在类的常量中(您甚至可以在< code>enum本身中执行此操作):

enum Server : string {
   const CASES = ['server1', 'server2']
   case SERVER1 = 'server1';
   case SERVER2 = 'server2';
}

然后在注释或属性中直接使用该常量:

parameters' => [
                [
                    'in' => 'header',
                    'name' => 'X-Server-Region',
                    'schema' => [
                    'type' => 'string',
                    'enum' => Server::CASES,
                    'example' => 'server1',
                 ],
                 'description' => 'Server to select',
                 'required' => true
             ],

...这并没有真正利用enum的优势,因为您仍然需要在两个地方编辑案例,而不仅仅是一个地方;并且仅对注释或属性是方便的。如果您对API资源使用XML或YAML配置,那就没那么好了。

 类似资料:
  • 我正在努力为Symfony Api平台中使用的请求正文获得正确的定义: 从上图中,我的endpoint期望的是包含必需值的JSON。我将必需值定义在中,但这不是真的,它们甚至不属于:、或。 我尝试了两种定义(并且删除了一些与解决方案无关的行): 第二个定义看起来像: 结果如下: 他们似乎都没有做我需要或期望的事情,我做错了什么?我能得到一些帮助吗? 我也读了几页/帖子,但没有找到一个好的例子或正确

  • 我正在使用从以下依赖项导入的Swagger/OpenAPIV3注释创建应用程序的API描述: 其中一个批注是批注,它接受名为的属性,该属性允许字符串数组: 现在,我想使用在枚举类上构造的自定义方法,该方法返回允许的字符串数组,因此不需要在每次向枚举添加类型时添加该方法。以便我们可以这样使用它: 现在这是无法编译的,因为在执行注释时不知道该方法。是否有这样的解决方案允许在SwaggerV3注释属性值

  • 我配置了以下UserDataPersister(直接取自教程): 和以下用户夹具: 但是我在加载这个夹具时会出现错误: 我的UserDataPersister实现与此相同。

  • 我有多个请求体需要使用相同的枚举,但我很难跨多个模式引用单个定义。 在我的< code>openapi.yaml文件中,我包含了: 在我为 POST/PUT 请求设置的正文定义中,我包括: 但在生成的代码中,正在创建的是: 而一个单独的类是使用以下命令创建的: 如何跨文件创建对枚举定义的引用?

  • 我正在使用OpenCV和JsonCpp在C++中创建一个库,以便为Android和iOS创建一个库。 在为Android测试我的库时,我正在制作JNI文件,但当我尝试加载库时,我得到了 这是因为我认为我的Json库构建得不是很好。 我使用的库是这样的:https://github.com/open-source-parsers/jsoncpp 我的Android.mk是: 即使我编译了JsonCp