如何在实体中像数组一样表示 type/status
how represent type/status like array in entity
在 symfony2 中,我有一个实体 Foo,它有一个名为 $kind 的字段,它可以有一些(最多大约 10 个)不同的值(每次一个),如下所示:
$kindArray('1' => 'type1', '2'=> 'type2');
并且 $kind 字段可以获得 $kindArray 索引之一。
我想要一个包含 $kindArray 的位置,并在创建 FooFormType 时将其用于 choiceType 值。
如何在实体中显示?我应该使用数组还是值对象之类的东西?
您可以将状态作为常量,然后 return 像这样在静态方法中使用它们..
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,
);
}
}
实体定义
您可以将这些种类作为常量存储在实体 class 中。
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'
是带有命名空间的实体的全名 class。 (请注意,之所以有效,是因为 class 中的所有常量都是种类。如果要添加另一个常量,则必须修改该代码。)
现在为您网站的所有语言创建翻译文件。我通常创建 YAML 文件。对于英语,它应该看起来像:
# YOUR_BUNDLE/Resources/translations/kinds.en.yml
KIND_1: first kind
KIND_2: kind no. 2
KIND_3: next kind
# ...
现在,当您为 Foo 实体创建表单时,传递您的新字段类型而不是 'choice'
:
->add('kind', new KindChoiceType());
在 symfony2 中,我有一个实体 Foo,它有一个名为 $kind 的字段,它可以有一些(最多大约 10 个)不同的值(每次一个),如下所示:
$kindArray('1' => 'type1', '2'=> 'type2');
并且 $kind 字段可以获得 $kindArray 索引之一。
我想要一个包含 $kindArray 的位置,并在创建 FooFormType 时将其用于 choiceType 值。
如何在实体中显示?我应该使用数组还是值对象之类的东西?
您可以将状态作为常量,然后 return 像这样在静态方法中使用它们..
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,
);
}
}
实体定义
您可以将这些种类作为常量存储在实体 class 中。
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'
是带有命名空间的实体的全名 class。 (请注意,之所以有效,是因为 class 中的所有常量都是种类。如果要添加另一个常量,则必须修改该代码。)
现在为您网站的所有语言创建翻译文件。我通常创建 YAML 文件。对于英语,它应该看起来像:
# YOUR_BUNDLE/Resources/translations/kinds.en.yml
KIND_1: first kind
KIND_2: kind no. 2
KIND_3: next kind
# ...
现在,当您为 Foo 实体创建表单时,传递您的新字段类型而不是 'choice'
:
->add('kind', new KindChoiceType());