Компонент предоставляет базовую функциональность для регистрации нового типа данных ENUM в Doctrine.
Таже поддерживается механизм doctrine:schema:update для ENUM'ов.
Важно: чтобы реализация поддержки ENUM'ов в команде doctrine:schema:update работала корректно
не указывайте движок базы данных:
- Работает корректно -
//user:pa$$word@host:3306/db_name - Работать не будет -
mysql://user:pa$$word@host:3306/db_name
Откройте консоль и, перейдя в директорию проекта, выполните следующую команду для загрузки наиболее подходящей стабильной версии этого компонента:
composer require wakeapp/dbal-enum-typeЭта команда подразумевает что Composer установлен и доступен глобально.
В качестве примера рассмотрим перечисление языков. Для начала нам необходимо создать класс со списком доступных языков:
<?phpdeclare(strict_types=1);
namespaceApp\AcmeBundle\Entity\Enum;
class LanguageListEnum
{
publicconstRU = 'ru';
publicconstEN = 'en';
publicconstDE = 'de';
}Для регистрации нашего перечисления как новый тип данных Doctrine необходимо создать еще один класс:
<?phpdeclare(strict_types=1);
namespaceApp\AcmeBundle\Doctrine\DBAL\Types;
useApp\AcmeBundle\Entity\Enum\LanguageListEnum;
useWakeapp\Component\DbalEnumType\Type\AbstractEnumType;
class LanguageListEnumType extends AbstractEnumType
{
/** * {@inheritdoc} */publicstaticfunctiongetEnumClass(): string
{
return LanguageListEnum::class;
}
/** * {@inheritdoc} */publicstaticfunctiongetTypeName(): string
{
return'language_list_enum';
}
}Создав необходимые классы остается только зарегистрировать их в Doctrine DBAL.
Для регистрации нового ENUM-типа воспользуйтесь официальной документацией Doctrine
Custom Mapping Types.
<?phpdeclare(strict_types=1);
\Doctrine\DBAL\Types\Type::addType(LanguageListEnumType::getTypeName(), LanguageListEnumType::class);Если вы используете Symfony, то воспользуйтесь соответствующим разделом документации -
How to Use Doctrine DBAL.
Для начала необходимо зарегистрировать новый глобальный тип данных enum:
doctrine:
dbal:
mapping_types:
enum: stringДалее необходимо установить доступный конкретный вид перечислений в виде списка языков.
Сделать это возможно двумя способами. Первый, классический, через добавление в конфигурационный файл Doctrine:
doctrine:
dbal:
types:
# Где ключ это LanguageListEnumType::getTypeName() и значение LanguageListEnumType::classlanguage_list_enum: App\AcmeBundle\Doctrine\DBAL\Types\LanguageListEnumTypeВторой способ подойдет если вы используете отдельный бандл. Регистрация происходит через метод boot:
<?phpdeclare(strict_types=1);
namespaceApp\AcmeBundle;
useApp\AcmeBundle\Doctrine\DBAL\Types\LanguageListEnumType;
useDoctrine\DBAL\Types\Type;
useSymfony\Component\HttpKernel\Bundle\Bundle;
class AppAcmeBundleBundle extends Bundle
{
publicfunctionboot()
{
Type::addType(LanguageListEnumType::getTypeName(), LanguageListEnumType::class);
parent::boot();
}
}В случае использования Symfony Framework необходимо зарегистрировать класс EnumEventSubscriber как сервис
с тегом doctrine.event_subscriber:
wakeapp.dbal_enum_type.event_subscriber.enum_event:
tags:
- { name: doctrine.event_subscriber, connection: default }А также указать driver_class в конфигурации doctrine/doctrine-bundle:
doctrine:
dbal:
driver_class: Wakeapp\Component\DbalEnumType\Driver\PDOMySql\EnumAwareDriverПри необходимости переопределить список значений enum,
определенных на основе констант класса из метода getEnumClass вы можете вызвать метод setValues.