Symfony 形成用作选择值的对象与基础数据之间的比较
Symfony Forms comparison between objects used as choice values and underlying data
我使用的是 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
.
classMyThings
定义为:
class MyThings
private Thing[] $myThings
当我创建表单时,我传递了一个带有一些预填充选项的对象,例如:
$form = $this->formFactory->create(
new MyThingsFormType(),
new MyThings([new Thing(21)])
);
关键是,我希望选项 Thing no.21
预先填充到视图中,因为我传递给表单的基础 MyThings
对象确实在 $myThings
数组...我知道它不是 相同的 对象,而只是具有相同数据的对象,显然 Symfony 进行了严格的比较,因此它不认为该选择是正在预选中...
那么,自定义该行为的最快最简洁的方法是什么,因此我可以考虑预先选择具有相同数据的选项,即使它们不相同 个对象?
我在 this response to a GitHub issue 中找到了解决方案。
The good thing about choice_value is that Symfony will also use this closure to compare two different object instances for equality.
诀窍就是简单地使用choice_value
选项来确定选择的值。类似于:
'choice_value' => function (Thing $thing) {
return $thing->getNumber();
},
此方法将在用作选择的 Thing
个对象和作为数据传递的对象上调用,因此即使它们是不同的实例,它们也会被视为相等...
我使用的是 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
.
classMyThings
定义为:
class MyThings
private Thing[] $myThings
当我创建表单时,我传递了一个带有一些预填充选项的对象,例如:
$form = $this->formFactory->create(
new MyThingsFormType(),
new MyThings([new Thing(21)])
);
关键是,我希望选项 Thing no.21
预先填充到视图中,因为我传递给表单的基础 MyThings
对象确实在 $myThings
数组...我知道它不是 相同的 对象,而只是具有相同数据的对象,显然 Symfony 进行了严格的比较,因此它不认为该选择是正在预选中...
那么,自定义该行为的最快最简洁的方法是什么,因此我可以考虑预先选择具有相同数据的选项,即使它们不相同 个对象?
我在 this response to a GitHub issue 中找到了解决方案。
The good thing about choice_value is that Symfony will also use this closure to compare two different object instances for equality.
诀窍就是简单地使用choice_value
选项来确定选择的值。类似于:
'choice_value' => function (Thing $thing) {
return $thing->getNumber();
},
此方法将在用作选择的 Thing
个对象和作为数据传递的对象上调用,因此即使它们是不同的实例,它们也会被视为相等...