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