40 lines
1.1 KiB
PHP
40 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace Nelmio\ApiDocBundle\ModelDescriber;
|
|
|
|
use Nelmio\ApiDocBundle\Model\Model;
|
|
use OpenApi\Annotations\Schema;
|
|
use Symfony\Component\PropertyInfo\Type;
|
|
|
|
class EnumModelDescriber implements ModelDescriberInterface
|
|
{
|
|
public function describe(Model $model, Schema $schema)
|
|
{
|
|
$enumClass = $model->getType()->getClassName();
|
|
|
|
$enums = [];
|
|
foreach ($enumClass::cases() as $enumCase) {
|
|
$enums[] = $enumCase->value;
|
|
}
|
|
|
|
$reflectionEnum = new \ReflectionEnum($enumClass);
|
|
if ($reflectionEnum->isBacked() && 'int' === $reflectionEnum->getBackingType()->getName()) {
|
|
$schema->type = 'integer';
|
|
} else {
|
|
$schema->type = 'string';
|
|
}
|
|
$schema->enum = $enums;
|
|
}
|
|
|
|
public function supports(Model $model): bool
|
|
{
|
|
if (!function_exists('enum_exists')) {
|
|
return false;
|
|
}
|
|
|
|
return Type::BUILTIN_TYPE_OBJECT === $model->getType()->getBuiltinType()
|
|
&& enum_exists($model->getType()->getClassName())
|
|
&& is_subclass_of($model->getType()->getClassName(), \BackedEnum::class);
|
|
}
|
|
}
|