Skip to content
This repository was archived by the owner on Nov 6, 2021. It is now read-only.

Repository files navigation

DBAL Enum Type

Latest Stable VersionTotal Downloads

Введение

Компонент предоставляет базовую функциональность для регистрации нового типа данных 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

В случае использования 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

При необходимости переопределить список значений enum, определенных на основе констант класса из метода getEnumClass вы можете вызвать метод setValues.

Лицензия

license

About

Provides basic functionality for working with ENUM type in the Doctrine

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages