как представить тип / статус как массив в сущности

В symfony2 у меня есть сущность Foo, которая имеет поле с именем $ kind, которое может иметь несколько (максимум около 10) различных значений (по одному в каждый момент времени) примерно так:

$kindArray('1' => 'type1', '2'=> 'type2');

и поле $ kind может получить один из индексов $ kindArray.

Я хочу одно местоположение, которое имеет $ kindArray и использовать его для значений choiceType при создании FooFormType.

как я могу показать это в сущности? я должен использовать массив или что-то вроде объекта значения?

1

Решение

Определение сущности

Вы можете хранить эти виды как константы в классе сущностей.

class Foo
{
const KIND_1 = 1;
const KIND_2 = 2;
const KIND_3 = 3;
//...

/**
* @ORM\Column(type="smallint")
*/
protected $kind;
}

Обратите внимание, что константы являются целыми числами, поэтому они легко хранятся в базе данных. я использовал smallint потому что это наименьшее целое число, доступное в Doctrine2.

форма

Создайте новое поле формы для вида:

class KindChoiceType extends AbstractType
{

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$class = new \ReflectionClass('Namespace\Bar\Foo');
$resolver->setDefaults(array(
'choices' => array_flip($class->getConstants()),
'translation_domain' => 'kinds'
));
}

public function getName()
{
return 'kind_choice';
}

public function getParent()
{
return 'choice';
}

}

'Namespace\Bar\Foo' полное имя вашего класса сущностей с пространством имен. (Обратите внимание, что это работает только потому, что все константы в классе являются разновидностями. Если вы добавите другие константы, вы должны изменить этот код.)

Теперь создайте файлы перевода для всех языков вашего сайта. Я обычно создаю YAML файл. Для английского это должно выглядеть так:

# YOUR_BUNDLE/Resources/translations/kinds.en.yml

KIND_1: first kind
KIND_2: kind no. 2
KIND_3: next kind
# ...

Теперь передайте ваш новый тип поля вместо 'choice' когда вы создаете форму для вашей сущности Foo:

->add('kind', new KindChoiceType());
3

Другие решения

Вы можете иметь состояния в качестве констант, а затем возвращать их статическим методом, например так …

class Thing
{
const STATE_1 = 'state_1';
const STATE_2 = 'state_2';
const STATE_3 = 'state_3';

public static function getAllStates()
{
return array(
self::STATE_1,
self::STATE_2,
self::STATE_3,
);
}
}
0

По вопросам рекламы [email protected]