#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, ... ]
.