Создан  demius PM 4 года назад; Обновил  demius PM 2 года назад

Способ задать 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, либо исследовать почему этот файл не принимается загрузчиком контейнера