Comments 11
А чем этот вариант не устроил https://github.com/fre5h/DoctrineEnumBundle?
+2
Это хороший бандл, но у него есть недостатки, важные для нас. В частности, значения перечисления там — строки. И при использовании в шаблонах нужно указывать тип перечисления, например readable_enum('BasketballPositionType'). Что создает проблемы при рефакторинге — нужно не забыть изменить шаблоны. А если значения перечисления — объекты, то можно не думать об этом и избежать ошибок, особенно в перечислениях с похожими значениями.
0
Если честно не совсем понял, зачем вы в шаблонах указываете тип я обычно делаю, что то типа такого:
{{ item.type|readable_enum|trans }}
И этого вполне хватает, в случае когда мне нужен в шаблоне список значений enum я явно передаю эти данные в шаблон, что соответственно избавляет меня от такого рода проблем.
{{ item.type|readable_enum|trans }}
И этого вполне хватает, в случае когда мне нужен в шаблоне список значений enum я явно передаю эти данные в шаблон, что соответственно избавляет меня от такого рода проблем.
0
А если есть 2 Enum-а с одинаковыми значениями, но разным переводом? Тогда в любом случае нужно указать его тип. А если где-то уже есть {{ item.type|readable_enum|trans }}, то и не забыть указать тип там.
0
Уважаемый, все ваши проблемы надуманные :)) К примеру типичная реализация 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',
];
}
Как видите с таким подходом ни какие переводы не пересекаются. Все в одном месте, рефакторить можно без проблем.
0
Это если у вас ни в каком перечислении нету таких же значений. А если есть, к примеру,
то нужно явно указывать тип в readable_enum. Самое плохое то, что если раньше EventQueueStatusEnum не было, а потом его добавили, то все, что использовало EventStatusEnumType в виде tem.type|readable_enum|trans, сломается
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, сломается
0
А с миграциями как-то удалось решить проблему? когда добавляется/удаляется поле в ENUM type? Сейчас приходится менять вручную
0
В 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'),
];
}
}
0
Все зависит от задачи. В вашем случае, например, нету описания типа для разных БД. А значит, нет проверки значения на стороне БД.
0
И в итоге в одном классе смешаны domain model, infrastructure и presentation.
Понятно, что если для проекта выбран yii, то либо это нормально, либо изначально неверно выбран фреймворк.
Но проекты бывают разные.
Понятно, что если для проекта выбран yii, то либо это нормально, либо изначально неверно выбран фреймворк.
Но проекты бывают разные.
0
Sign up to leave a comment.
Enum в PHP