wakeapp / dbal-enum-type
Provides basic functionality for working with ENUM type in the Doctrine
Installs: 16 268
Dependents: 1
Suggesters: 0
Security: 0
Stars: 1
Watchers: 7
Forks: 0
Open Issues: 0
Requires
- php: ~7.1 || ~8.0
- ext-mbstring: *
- doctrine/dbal: ~2.13
Suggests
- doctrine/doctrine-bundle: Provides integration Doctrine with Symfony framework
This package is auto-updated.
Last update: 2021-12-05 10:22:45 UTC
README
Введение
Компонент предоставляет базовую функциональность для регистрации нового типа данных 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 установлен и доступен глобально.
Пример использования
В качестве примера рассмотрим перечисление языков. Для начала нам необходимо создать класс со списком доступных языков:
<?php declare(strict_types=1); namespace App\AcmeBundle\Entity\Enum; class LanguageListEnum { public const RU = 'ru'; public const EN = 'en'; public const DE = 'de'; }
Для регистрации нашего перечисления как новый тип данных Doctrine
необходимо создать еще один класс:
<?php declare(strict_types=1); namespace App\AcmeBundle\Doctrine\DBAL\Types; use App\AcmeBundle\Entity\Enum\LanguageListEnum; use Wakeapp\Component\DbalEnumType\Type\AbstractEnumType; class LanguageListEnumType extends AbstractEnumType { /** * {@inheritdoc} */ public static function getEnumClass(): string { return LanguageListEnum::class; } /** * {@inheritdoc} */ public static function getTypeName(): string { return 'language_list_enum'; } }
Создав необходимые классы остается только зарегистрировать их в Doctrine DBAL
.
Для регистрации нового ENUM
-типа воспользуйтесь официальной документацией Doctrine
Custom Mapping Types.
<?php declare(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::class language_list_enum: App\AcmeBundle\Doctrine\DBAL\Types\LanguageListEnumType
Второй способ подойдет если вы используете отдельный бандл. Регистрация происходит через метод boot
:
<?php declare(strict_types=1); namespace App\AcmeBundle; use App\AcmeBundle\Doctrine\DBAL\Types\LanguageListEnumType; use Doctrine\DBAL\Types\Type; use Symfony\Component\HttpKernel\Bundle\Bundle; class AppAcmeBundleBundle extends Bundle { public function boot() { 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
.