用作选择值的对象与基础数据之间的Symfony Forms比较

时间:2019-07-11 10:27:11

标签: symfony symfony-forms

我正在使用Symfony 2.8,但问题并不特定于此版本。
假设我在此字段中有MyThingsFormType

$builder->add(
    'things',
    ChoiceType::class,
    [
        'multiple' => true,
        'choices_as_values' => true,
        'choices' => [
            'Thing no.20' => new Thing(20),
            'Thing no.21' => new Thing(21),
            'Thing no.22' => new Thing(22),
        ],
    ]
);

'data_class' => MyThings::class

MyThings定义为:

class MyThings
   private Thing[] $myThings

当我创建表单时,我传递了一个带有一些预填充选项的对象,例如:

$form = $this->formFactory->create(
    new MyThingsFormType(), 
    new MyThings([new Thing(21)])
);

问题是,我希望选择Thing no.21会在视图中预先填充,因为我传递给表单的基础MyThings对象确实在{{1 }}数组...我知道它不是同一对象,而是一个具有相同数据的对象,显然Symfony进行了严格的比较,因此它不认为该选择是预先选择的。 ..

那么,自定义行为的最快,最简洁的方法是什么,那么我可以考虑预先选择具有相同数据的选择,即使它们不是相同的对象。

1 个答案:

答案 0 :(得分:0)

我在this response to a GitHub issue中找到了解决方案。

  

choice_value的好处是Symfony还将使用此闭包来比较两个不同的对象实例是否相等。

技巧只是使用choice_value选项来确定选择的值。像这样:

'choice_value' => function (Thing $thing) {
    return $thing->getNumber();
},

将在用作选择的Thing对象以及作为数据传递的对象上调用此方法,因此即使它们是不同的实例,它们也将被视为相等...