Pull to refresh

Comments 11

А чем этот вариант не устроил https://github.com/fre5h/DoctrineEnumBundle?
Это хороший бандл, но у него есть недостатки, важные для нас. В частности, значения перечисления там — строки. И при использовании в шаблонах нужно указывать тип перечисления, например readable_enum('BasketballPositionType'). Что создает проблемы при рефакторинге — нужно не забыть изменить шаблоны. А если значения перечисления — объекты, то можно не думать об этом и избежать ошибок, особенно в перечислениях с похожими значениями.
Если честно не совсем понял, зачем вы в шаблонах указываете тип я обычно делаю, что то типа такого:

{{ item.type|readable_enum|trans }}

И этого вполне хватает, в случае когда мне нужен в шаблоне список значений enum я явно передаю эти данные в шаблон, что соответственно избавляет меня от такого рода проблем.
А если есть 2 Enum-а с одинаковыми значениями, но разным переводом? Тогда в любом случае нужно указать его тип. А если где-то уже есть {{ item.type|readable_enum|trans }}, то и не забыть указать тип там.
Уважаемый, все ваши проблемы надуманные :)) К примеру типичная реализация enum:

<?php

namespace ApiBundle\DBAL\Types;

use Fresh\DoctrineEnumBundle\DBAL\Types\AbstractEnumType;

class EventStatusEnumType extends AbstractEnumType
{
    const
        DRAFT = 'draft',
        STARTED = 'started',
        PAUSED = 'paused',
        COMPLETED = 'completed',
        FINISHED = 'finished'
    ;

    protected static $choices = [
        self::DRAFT => 'enum.eventStatus.draft',
        self::STARTED => 'enum.eventStatus.started',
        self::PAUSED => 'enum.eventStatus.paused',
        self::COMPLETED => 'enum.eventStatus.completed',
        self::FINISHED => 'enum.eventStatus.finished',
    ];
}


Как видите с таким подходом ни какие переводы не пересекаются. Все в одном месте, рефакторить можно без проблем.
Это если у вас ни в каком перечислении нету таких же значений. А если есть, к примеру,
class EventQueueStatusEnum extends AbstractEnumType
{
    const
        DRAFT = 'draft',
        STARTED = 'started',

 protected static $choices = [
        self::DRAFT => 'enum.eventQueueStatus.draft',
        self::STARTED => 'enum.eventQueueStatus.started',
}

то нужно явно указывать тип в readable_enum. Самое плохое то, что если раньше EventQueueStatusEnum не было, а потом его добавили, то все, что использовало EventStatusEnumType в виде tem.type|readable_enum|trans, сломается
А с миграциями как-то удалось решить проблему? когда добавляется/удаляется поле в ENUM type? Сейчас приходится менять вручную
Пока нет, приходится вручную менять комментарий к полю. Наверное, можно написать свой компаратор.
В Yii2 это все реализуется в помощью валидатора и без лишних заморочек ).

class Post extends ActiveRecord
{
    const STATUS_DISABLE = 1;

    const STATUS_ACTIVE = 10;

    public function rules()
    {
        return [
            [['status'], 'in', 'range' => array_keys($this->getStatusList())],
        ];
    }

    public function getStatusList()
    {
        return [
            self::STATUS_ACTIVE => Yii::t('app', 'Activate'),
            self::STATUS_DISABLE => Yii::t('app', 'Deactivate'),
        ];
    }
}
Все зависит от задачи. В вашем случае, например, нету описания типа для разных БД. А значит, нет проверки значения на стороне БД.
И в итоге в одном классе смешаны domain model, infrastructure и presentation.

Понятно, что если для проекта выбран yii, то либо это нормально, либо изначально неверно выбран фреймворк.
Но проекты бывают разные.
Sign up to leave a comment.

Articles