Сравнение форм Symfony между объектами, используемыми в качестве значений выбора и базовых данных - PullRequest
0 голосов
/ 11 июля 2019

Я использую 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, который я передаю в форму, имеет этот объект в массиве $myThings ... Я знаю, что этоне тот же объект, а просто объект с теми же данными, и, очевидно, Symfony проводит строгое сравнение, поэтому он не считает этот выбор предварительно выбранным ...

Итак,какой бы самый быстрый и чистый способ настроить это поведение, чтобы я мог заранее рассмотреть варианты, которые имеют одинаковые данные, даже если они не одинаковые объекты?

1 Ответ

0 голосов
/ 11 июля 2019

Я нашел решение в этом ответе на проблему GitHub .

Хорошая вещь о choice_value заключается в том, что Symfony также будет использовать это замыкание для сравнения двух разных экземпляров объекта на равенство.

Хитрость заключается в том, чтобы просто использовать опцию choice_value, чтобы определить значение выбора. Что-то вроде:

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

Этот метод будет вызываться для Thing объектов, используемых в качестве вариантов выбора, и для объектов, переданных в качестве данных, поэтому они будут считаться равными, даже если они являются разными экземплярами ...

...