Способ задать MyClumbs/Enum в качестве атрибута сущности. Штука полезная, но пока не нужная, а проблемы создающая.
Во-первых эту штуку решает пакет acelaya/doctrine-enum-type, но он умеет в качестве типов доктрины добавлять только enum с строковыми значениями. Для того, чтобы можно было добавить enumс числовыми значениями, необходимо добаивть новый класс регистратор типов доктрины:
<?php
/**
* User: demius
* Date: 24.01.2022
* Time: 0:25
*/
declare(strict_types=1);
namespace App\Service\Doctrine\Type;
use Acelaya\Doctrine\Type\PhpEnumType;
use Doctrine\DBAL\Platforms\AbstractPlatform;
class PhpIntEnumType extends PhpEnumType
{
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform): string
{
return $platform->getSmallIntTypeDeclarationSQL($fieldDeclaration);
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return parent::convertToPHPValue((int) $value, $platform);
}
}
Сами по себе Enum не станут корректными типами, так как для каждого инстанса будет свой enum. Вместо этого в файл App/Kernel в процесс инстанцирования приложения в boot() добавляем новый этап:
/**
* @throws Exception
*/
private function configureDoctrine(): void
{
PhpIntEnumType::registerEnumTypes(
[
DocStateEnum::class,
]
);
}
После этого в описании полей сущности можно писать так:
/**
* @var DocStateEnum
* @ORM\Column (type=DocStateEnum::class, nullable=false)
*/
private DocStateEnum $state;
Это все замечательно работает, вот только именно для атрибута doc::state использование enum оказалось неудобным. Все гораздо проще, хранить константы напрямую в сущности. А использование enum для дополнительных атрибутов значений не так уж и нужно.
Кроме того, на нам класс регистратора типов почему-то периодически ругался class-loader контейнера не в силах его загрузить. Как сервис он мне и не нужен, докрина его хранит в собственном синглетоне, но лежит он в месте, куда смотрит автолоадер. Так что или перепродумывать архитектуру приложения так, чтобы подобные вещи не лежали в App/Services, либо исследовать почему этот файл не принимается загрузчиком контейнера