如何在实体中表示像数组一样的类型/状态

时间:2015-02-24 16:46:28

标签: php symfony design-patterns doctrine-orm domain-driven-design

在symfony2中我有一个实体Foo,它有一个名为$ kind的字段,可以有一些(最多约10个)不同的值(每次一个),如下所示:

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

和$ kind字段可以获得$ kindArray索引之一。

我想要一个具有$ kindArray的位置,并在创建FooFormType时将其用于choiceType值。

如何在实体中显示它?我应该使用数组还是类似值对象?

2 个答案:

答案 0 :(得分:3)

实体定义

您可以将这些类型存储为实体类中的常量。

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

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

请注意,常量是整数,因此它们很容易存储在数据库中。我使用了smallint,因为它是Doctrine2中可用的最小整数。

表格

为kind创建新的表单字段:

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

在为Foo实体创建表单时,现在传递新字段类型而不是'choice'

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

答案 1 :(得分:0)

您可以将状态作为常量,然后以静态方法返回它们。

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,
        );
    }
}