微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Api-Platform + Swagger:通过 Doctrine 或 ApiPlatform 映射对操作/实体进行分组

如何解决Api-Platform + Swagger:通过 Doctrine 或 ApiPlatform 映射对操作/实体进行分组

我有config/packages/api_platform.yaml

api_platform:
    mapping:
        paths: 
            - '%kernel.project_dir%/src/Entity'
            - '%kernel.project_dir%/old/Entity'

在两个命名空间中,我都有同名的实体。我该怎么做才能让它们显示/docs 分组到不同的映射中,而不是单独按实体类名称显示

如何为每个命名空间配置“全局”前缀?

解决方法

API 平台目前不提供此配置,您必须将 OpenApiFactory 装饰成 this

swagger 文档按 tags

对它们进行分组
<?php
// src/OpenApi/OpenApiFactory.php

namespace App\OpenApi;

use ApiPlatform\Core\OpenApi\Factory\OpenApiFactoryInterface;
use ApiPlatform\Core\OpenApi\OpenApi;
use ApiPlatform\Core\OpenApi\Model;

final class OpenApiFactory implements OpenApiFactoryInterface
{
    private $decorated;

    public function __construct(OpenApiFactoryInterface $decorated)
    {
        $this->decorated = $decorated;
    }

    public function __invoke(array $context = []): OpenApi
    {
        $openApi = $this->decorated->__invoke($context);

        $paths = $openApi->getPaths()->getPaths();

        $filteredPaths = new Model\Paths();
        foreach ($paths as $path => $pathItem) {
            // Here you can check the tags for each Operations
            // Add custom logic with the snippet below
        }

        return $openApi->withPaths($filteredPaths);
    }
}

脏部分来了,标签将是 EntityName 而不是完整的命名空间名称 我会列出所有旧实体,过滤当前标签并更改为旧或新 (以下为伪代码)

$OldEntityList = ['entity1','entity2',...]
foreach ($Operations as $op) {
  if (in_array($op->getTags(),$OldEntityList) {
     $op->withTags('old');
  } else {
     $op->withTags('new');
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。