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