Api-Платформа чванство: группирование операций/сущностей по доктрине или сопоставлению ApiPlatform

#doctrine-orm #entitymanager #api-platform.com #doctrine-mapping

Вопрос:

У меня есть config/packages/api_platform.yaml :

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

В обоих пространствах имен у меня есть сущности с одинаковыми именами. Что мне нужно сделать, чтобы они отображались /docs сгруппированными в разные сопоставления, а не только по имени класса сущности.

Как настроить префикс «глобально» для каждого из пространств имен?

Ответ №1:

Платформа API не предоставляет эту конфигурацию прямо сейчас, вам придется украсить OpenApiFactory ее так

Документация swagger группирует их по их tags

 <?php
// src/OpenApi/OpenApiFactory.php

namespace AppOpenApi;

use ApiPlatformCoreOpenApiFactoryOpenApiFactoryInterface;
use ApiPlatformCoreOpenApiOpenApi;
use ApiPlatformCoreOpenApiModel;

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 ModelPaths();
        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');
  }
}
 

Комментарии:

1. Это уродливый АФ.

2. Поскольку чванство генерируется idk, как сделать лучше, вы можете добавить openapi_context во ВСЕ сущности или попробовать использовать класс PHP Reflector, чтобы узнать, является ли он старым/новым каталогом

3. Я не жалуюсь на тебя. Просто из-за отсутствия глобальных настроек для этого в конфигурации. Например, с путями , вложенными метками, например path => label , или label => [ paths, ... ] .