Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 对象包装器和窗体_Oop_Design Patterns_Symfony_Symfony Forms - Fatal编程技术网

Oop 对象包装器和窗体

Oop 对象包装器和窗体,oop,design-patterns,symfony,symfony-forms,Oop,Design Patterns,Symfony,Symfony Forms,我正在开发一个电子商务平台,遇到了一个困难。基本上,我在我的场景中有一个产品、期权和期权价值。一个产品可能有多个选项,这些选项可能有多个值。问题在于如何以易于创建和编辑的方式存储它 问题是我直接引用了OptionValue,它是可变的。我需要保留关于选项和OptionValue的不可变信息(例如,如果下了订单且颜色为绿色,即使此选项更改为淡绿色,订单也必须保持显示为绿色)。在这种情况下,我需要保存选项的一些属性(例如选项名-“颜色”)和每个选项值(例如每个选项的值-“红色”)。按照我的想法,它

我正在开发一个电子商务平台,遇到了一个困难。基本上,我在我的场景中有一个产品、期权和期权价值。一个产品可能有多个选项,这些选项可能有多个值。问题在于如何以易于创建和编辑的方式存储它

问题是我直接引用了OptionValue,它是可变的。我需要保留关于选项和OptionValue的不可变信息(例如,如果下了订单且颜色为绿色,即使此选项更改为淡绿色,订单也必须保持显示为绿色)。在这种情况下,我需要保存选项的一些属性(例如选项名-“颜色”)和每个选项值(例如每个选项的值-“红色”)。按照我的想法,它需要一个与现有结构非常相似的结构:一个新的类ItemOption引用Option和一个ItemOptionValue引用OptionValue

所以,这是我的尝试:

要创建表格以显示我的选项,我有:

class OptionSelectorType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($options['product']->getOptions() as $option) {
            $builder->add($option->getId(), 'choice', array('choice_list' => new ObjectChoiceList($option->getValues());));
        }
    }
}
我正在使用DataTransformer转换OrderItemOption集合中的OptionValue集合:

class OrderItemOptionToOptionValueTransformer implements DataTransformerInterface
{ 
    public function transform($lineOptions)
    {
      if(!$lineOptions) {
        return array();
      }
      $values = array();
      foreach($lineOptions as $lineOption) {
        $lineOption->getOption()->getId();
        $values[$id] = array();

        foreach($lineOption->getValues() as $lineOptionValue) {
          $values[$id][] = $lineOptionValue->getOptionValue();
        }
      }

        return $values;
    }

    public function reverseTransform($values)
    {
      $collection = new ArrayCollection();
      foreach($values as $optionId => $optionValues) {
        if(!$optionValues) {
          continue;
        }

        $lineOption = new OrderItemOption();
        $optionValues = is_array($optionValues) ? $optionValues : array($optionValues);
        foreach($optionValues as $optionValue) {
          $lineOptionValue = new OrderItemOptionValue();
          $lineOptionValue->setOptionValue($optionValue);
          $lineOption->addValue($lineOptionValue);
        }

        $lineOption->setOption($optionValue->getOption());
        $collection->add($lineOption);
      }

      return $collection;
    }
}
最后,我的OrderItemType表单:

class OrderItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder->add(
        $builder->create('options', 'option_selector', array('options' => $options['options']))
        ->addModelTransformer(new OrderItemOptionToOptionValueTransformer())
      );
    }
}
它可以工作,但在我看来不是一个好方法,一旦OptionValue将始终被重新创建,永远不会更新


你会怎么做?

我会保持简单。你可以坚持你的结构,但不要在运行中改变事物,而是保持它们处于相同的状态

我是什么意思?

无论何时创建选项,都要创建相应的ItemOption。OptionValue和ItemOptionValue也是如此。两者之间的关系是一对一的连接,而Option和OptionValue不知道connected itempoption和itempoptionvalue

现在,如果OptionValue发生更改,您可以查询连接的ItemOptionValue并更改需要更改的内容(取决于内部结构)

如何存储连接?

使用您已经使用的任何持久性方法。对于数据库,将连接存储在一个表中,如下所示:

CREATE TABLE item_option_to_option (
    optionID INT(10) NOT NULL,
    itemOptionID INT(10) NOT NULL,
    UNIQUE KEY (optionID, itemOptionID)
);
如果可能,我会使用外键将这两列链接到表
item_option
option
中的相应列。它与OptionValue和ItemOptionValue的工作原理相同

如何处理更改?

每当调用OptionValue更改的控制器时,只需更新Item*模型即可

如果某个选项或选项值被删除,则由您决定是否同时删除ItemOption或ItemOptionValue