diff --git a/src/Builder/FormContractor.php b/src/Builder/FormContractor.php index 0082b72c7..a4091f4ab 100644 --- a/src/Builder/FormContractor.php +++ b/src/Builder/FormContractor.php @@ -98,6 +98,9 @@ public function getFormBuilder($name, array $options = []) public function getDefaultOptions($type, FieldDescriptionInterface $fieldDescription) { + // NEXT_MAJOR: Remove this line and update the function signature. + $formOptions = \func_get_args()[2] ?? []; + $options = []; $options['sonata_field_description'] = $fieldDescription; @@ -174,13 +177,7 @@ public function getDefaultOptions($type, FieldDescriptionInterface $fieldDescrip $options['type'] = AdminType::class; $options['modifiable'] = true; - $options['type_options'] = [ - 'sonata_field_description' => $fieldDescription, - 'data_class' => $fieldDescription->getAssociationAdmin()->getClass(), - 'empty_data' => static function () use ($fieldDescription) { - return $fieldDescription->getAssociationAdmin()->getNewInstance(); - }, - ]; + $options['type_options'] = $this->getDefaultAdminTypeOptions($fieldDescription, $formOptions); } return $options; @@ -215,4 +212,21 @@ private function isAnyInstanceOf(?string $type, array $classes): bool return false; } + + private function getDefaultAdminTypeOptions(FieldDescriptionInterface $fieldDescription, array $formOptions): array + { + $typeOptions = [ + 'sonata_field_description' => $fieldDescription, + 'data_class' => $fieldDescription->getAssociationAdmin()->getClass(), + 'empty_data' => static function () use ($fieldDescription) { + return $fieldDescription->getAssociationAdmin()->getNewInstance(); + }, + ]; + + if (isset($formOptions['by_reference'])) { + $typeOptions['by_reference'] = $formOptions['by_reference']; + } + + return $typeOptions; + } } diff --git a/tests/Builder/FormContractorTest.php b/tests/Builder/FormContractorTest.php index a3809126f..817efe37d 100644 --- a/tests/Builder/FormContractorTest.php +++ b/tests/Builder/FormContractorTest.php @@ -116,13 +116,16 @@ public function testDefaultOptionsForSonataFormTypes(): void // collection type $fieldDescription->method('getMappingType')->willReturn(ClassMetadata::ONE_TO_MANY); foreach ($collectionTypes as $formType) { - $options = $this->formContractor->getDefaultOptions($formType, $fieldDescription); + $options = $this->formContractor->getDefaultOptions($formType, $fieldDescription, [ + 'by_reference' => false, + ]); $this->assertSame($fieldDescription, $options['sonata_field_description']); $this->assertSame(AdminType::class, $options['type']); $this->assertTrue($options['modifiable']); $this->assertSame($fieldDescription, $options['type_options']['sonata_field_description']); $this->assertSame($modelClass, $options['type_options']['data_class']); $this->assertSame($model, $options['type_options']['empty_data']()); + $this->assertFalse($options['type_options']['by_reference']); } }