【问题标题】:how represent type/status like array in entity如何在实体中表示类型/状态,如数组
【发布时间】:2015-02-24 16:46:28
【问题描述】:

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

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

并且 $kind 字段可以获取 $kindArray 索引之一。

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

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

【问题讨论】:

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


    【解决方案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
    # ...
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多