Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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
Php Symfony在用作选择值的对象和基础数据之间形成比较_Php_Symfony_Symfony Forms - Fatal编程技术网

Php Symfony在用作选择值的对象和基础数据之间形成比较

Php Symfony在用作选择值的对象和基础数据之间形成比较,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我使用的是Symfony 2.8,但这个问题并不是针对这个版本的。 假设我有MyThingsFormType和此字段: $builder->add( 'things', ChoiceType::class, [ 'multiple' => true, 'choices_as_values' => true, 'choices' => [ 'Thing no.20' =>

我使用的是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)])
);
关键是,我希望choice Thing no.21在视图中预先填充,因为我传递给表单的底层MyThings对象在$MyThings数组中确实有该对象。。。我知道这不是一个相同的对象,而是一个有相同数据的对象,显然Syffon做了严格的比较,所以它不认为选择是预先选择的……/P>
<> P>那么,什么是定制行为的最快和最干净的方法,所以我可以考虑预先选择的那些具有相同数据的选择,即使它们不是同一个对象吗?

< P>我已经找到了解决方案。

choice_值的好处在于,Symfony还将使用此闭包来比较两个不同的对象实例是否相等

诀窍就是简单地使用choice_value选项来确定选项的值。比如:

'choice_value' => function (Thing $thing) {
    return $thing->getNumber();
},
此方法将在用作选项的对象和作为数据传递的对象上调用,因此即使它们是不同的实例,它们也将被视为相等的