Skip to content
This repository has been archived by the owner on Nov 6, 2021. It is now read-only.
/ dbal-enum-type Public archive

Provides basic functionality for working with ENUM type in the Doctrine

License

Notifications You must be signed in to change notification settings

wakeapp/dbal-enum-type

Repository files navigation

DBAL Enum Type

Latest Stable Version Total 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 установлен и доступен глобально.

Пример использования

В качестве примера рассмотрим перечисление языков. Для начала нам необходимо создать класс со списком доступных языков:

<?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.

Лицензия

license