diff --git a/src/DefaultFormFactory.php b/src/DefaultFormFactory.php index 77557ef..922ccad 100644 --- a/src/DefaultFormFactory.php +++ b/src/DefaultFormFactory.php @@ -39,8 +39,12 @@ public function __construct( /** * {@inheritdoc} */ - public function create(string $dataClass): FormInterface + public function create(string $dataClass, array $data = []): FormInterface { + if ($data) { + return $this->import($this->dataMapperFactory->create($dataClass)->toDataObject($data)->dto); + } + return $this->cache[$dataClass] ??= new Form( $this->transformerFactory->create($dataClass), $this->dataMapperFactory->create($dataClass), diff --git a/src/FormFactoryInterface.php b/src/FormFactoryInterface.php index 90764e7..1bc883f 100644 --- a/src/FormFactoryInterface.php +++ b/src/FormFactoryInterface.php @@ -11,12 +11,13 @@ interface FormFactoryInterface * Create a form instance which handle given DTO class * * @param class-string $dataClass DTO class name + * @param array $data Initial data to populate the form. Keys must corresponds to form properties. Partial data are accepted. * * @return FormInterface * * @template T as object */ - public function create(string $dataClass): FormInterface; + public function create(string $dataClass, array $data = []): FormInterface; /** * Create a form and import data into it diff --git a/src/Transformer/RuntimeFormTransformerFactory.php b/src/Transformer/RuntimeFormTransformerFactory.php index 3207518..cd9f888 100644 --- a/src/Transformer/RuntimeFormTransformerFactory.php +++ b/src/Transformer/RuntimeFormTransformerFactory.php @@ -100,7 +100,7 @@ private function fieldTransformers(ReflectionProperty $property): array { $transformers = []; $needCast = $property->hasType(); - $needDefaultValue = $property->getDefaultValue() !== null; + $needDefaultValue = $property->hasDefaultValue() && $property->getDefaultValue() !== null; foreach ($property->getAttributes() as $attribute) { $className = $attribute->getName(); diff --git a/src/Util/Code.php b/src/Util/Code.php index 005f0cb..ea690e3 100644 --- a/src/Util/Code.php +++ b/src/Util/Code.php @@ -84,20 +84,28 @@ public static function value(mixed $value): string public static function instantiate(object $o): string { $reflection = new ReflectionClass($o); + $constructor = $reflection->getConstructor(); + + if (!$constructor) { + return self::new($o::class); + } $properties = []; - foreach ($reflection->getProperties() as $property) { - if ($property->isPromoted()) { - $value = $property->getValue($o); + foreach ($constructor->getParameters() as $parameter) { + if (!$parameter->isPromoted()) { + continue; + } + + $property = $reflection->getProperty($parameter->name); + $value = $property->getValue($o); - if ($value !== $property->getDefaultValue()) { - $properties[$property->name] = $property->getValue($o); - } + if (!$parameter->isDefaultValueAvailable() || $value !== $parameter->getDefaultValue()) { + $properties[$property->name] = $value; } } - return self::new(get_class($o), $properties); + return self::new($o::class, $properties); } /** diff --git a/tests/DefaultFormFactoryTest.php b/tests/DefaultFormFactoryTest.php index 5b7aada..f7b0433 100644 --- a/tests/DefaultFormFactoryTest.php +++ b/tests/DefaultFormFactoryTest.php @@ -7,6 +7,7 @@ use PHPUnit\Framework\TestCase; use Quatrevieux\Form\Fixtures\ConfiguredLengthValidator; use Quatrevieux\Form\Fixtures\SimpleRequest; +use Quatrevieux\Form\Fixtures\SimpleRequestConstructor; use Quatrevieux\Form\Fixtures\TestConfig; use Quatrevieux\Form\Fixtures\WithExternalDependencyConstraintRequest; use Quatrevieux\Form\Util\Functions; @@ -46,6 +47,34 @@ public function test_create() $this->assertSame($form, $factory->create(SimpleRequest::class)); } + public function test_create_with_data() + { + $factory = DefaultFormFactory::runtime(); + $form = $factory->create(SimpleRequest::class, ['foo' => 'aaaa']); + + $this->assertInstanceOf(ImportedForm::class, $form); + $this->assertSame('aaaa', $form->value()->foo); + $this->assertFalse(isset($form->value()->bar)); + + $expected = new SimpleRequest(); + $expected->foo = 'aaaa'; + $expected->bar = 'bbbb'; + $this->assertEquals($expected, $form->submit(['bar' => 'bbbb'])->value()); + } + + public function test_create_with_data_constructor() + { + $factory = DefaultFormFactory::runtime(); + $form = $factory->create(SimpleRequestConstructor::class, ['foo' => 'aaaa']); + + $this->assertInstanceOf(ImportedForm::class, $form); + $this->assertSame('aaaa', $form->value()->foo); + $this->assertFalse(isset($form->value()->bar)); + + $expected = new SimpleRequestConstructor('aaaa', 'bbbb'); + $this->assertEquals($expected, $form->submit(['bar' => 'bbbb'])->value()); + } + public function test_import() { $factory = DefaultFormFactory::runtime(); diff --git a/tests/Transformer/Generator/FormTransformerGeneratorTest.php b/tests/Transformer/Generator/FormTransformerGeneratorTest.php index 4106dee..fe45e03 100644 --- a/tests/Transformer/Generator/FormTransformerGeneratorTest.php +++ b/tests/Transformer/Generator/FormTransformerGeneratorTest.php @@ -505,7 +505,7 @@ function transformFromHttp(array $value): TransformationResult $translator = $this->registry->getTranslator(); try { - $transformed['foo'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value['foo'] ?? null); + $transformed['foo'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value['foo'] ?? null); } catch (\Quatrevieux\Form\Transformer\TransformerException $e) { $errors['foo'] = $e->errors; $transformed['foo'] = null; @@ -520,7 +520,7 @@ function transformFromHttp(array $value): TransformationResult function transformToHttp(array $value): array { return [ - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value['foo'] ?? null), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value['foo'] ?? null), 'bar' => $value['bar'] ?? null, ]; } @@ -528,7 +528,7 @@ function transformToHttp(array $value): array public function transformFieldFromHttp(string $fieldName, mixed $value): mixed { return match ($fieldName) { - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value), 'bar' => $value, }; } @@ -536,7 +536,7 @@ public function transformFieldFromHttp(string $fieldName, mixed $value): mixed public function transformFieldToHttp(string $fieldName, mixed $value): mixed { return match ($fieldName) { - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value), 'bar' => $value, }; } @@ -758,7 +758,7 @@ function transformFromHttp(array $value): TransformationResult $translator = $this->registry->getTranslator(); try { - $transformed['foo'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value['foo'] ?? null); + $transformed['foo'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value['foo'] ?? null); } catch (\Quatrevieux\Form\Transformer\TransformerException $e) { $errors['foo'] = $e->errors; $transformed['foo'] = null; @@ -768,7 +768,7 @@ function transformFromHttp(array $value): TransformationResult } try { - $transformed['bar'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value['bar'] ?? null); + $transformed['bar'] = (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value['bar'] ?? null); } catch (\Exception $e) { $transformed['bar'] = $value['bar'] ?? null; } @@ -779,24 +779,24 @@ function transformFromHttp(array $value): TransformationResult function transformToHttp(array $value): array { return [ - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value['foo'] ?? null), - 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value['bar'] ?? null), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value['foo'] ?? null), + 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value['bar'] ?? null), ]; } public function transformFieldFromHttp(string $fieldName, mixed $value): mixed { return match ($fieldName) { - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value), - 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformFromHttp($value), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value), + 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformFromHttp($value), }; } public function transformFieldToHttp(string $fieldName, mixed $value): mixed { return match ($fieldName) { - 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value), - 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer(transformerException: false))->transformToHttp($value), + 'foo' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value), + 'bar' => (new \Quatrevieux\Form\Transformer\Generator\FailingTransformer())->transformToHttp($value), }; } } diff --git a/tests/Util/CodeTest.php b/tests/Util/CodeTest.php index 144330e..0787201 100644 --- a/tests/Util/CodeTest.php +++ b/tests/Util/CodeTest.php @@ -31,9 +31,9 @@ public function test_value() $this->assertSame("['foo', 123]", Code::value(['foo', 123])); $this->assertSame("['foo' => 123, 'bar' => 456]", Code::value(['foo' => 123, 'bar' => 456])); $this->assertSame("(object) ['foo' => 'bar']", Code::value((object) ['foo' => 'bar'])); - $this->assertSame("new \Quatrevieux\Form\Transformer\Field\Csv(separator: ';', enclosure: '')", Code::value(new Csv(separator: ';'))); + $this->assertSame("new \Quatrevieux\Form\Transformer\Field\Csv(separator: ';')", Code::value(new Csv(separator: ';'))); $this->assertSame("\Quatrevieux\Form\Transformer\Field\CastType::Int", Code::value(CastType::Int)); - $this->assertSame("[new \Quatrevieux\Form\Transformer\Field\Csv(separator: ';', enclosure: ''), new \Quatrevieux\Form\Transformer\Field\ArrayCast(elementType: \Quatrevieux\Form\Transformer\Field\CastType::Int, preserveKeys: true)]", Code::value([new Csv(separator: ';'), new ArrayCast(CastType::Int)])); + $this->assertSame("[new \Quatrevieux\Form\Transformer\Field\Csv(separator: ';'), new \Quatrevieux\Form\Transformer\Field\ArrayCast(elementType: \Quatrevieux\Form\Transformer\Field\CastType::Int)]", Code::value([new Csv(separator: ';'), new ArrayCast(CastType::Int)])); $this->assertSame('$foo', Code::value(Code::raw('$foo'))); $this->assertSame('new \DateTimeZone(\'Europe/Paris\')', Code::value(new \DateTimeZone('Europe/Paris'))); } diff --git a/tests/View/GeneratedFormViewInstantiatorFactoryTest.php b/tests/View/GeneratedFormViewInstantiatorFactoryTest.php index da4de04..b470384 100644 --- a/tests/View/GeneratedFormViewInstantiatorFactoryTest.php +++ b/tests/View/GeneratedFormViewInstantiatorFactoryTest.php @@ -233,12 +233,12 @@ class Quatrevieux_Form_Fixtures_WithChoiceRequestViewGeneratorTesting implements function submitted(array $value, array $errors, ?string $rootField = null): Quatrevieux\Form\View\FormView { - return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView('value', $value['value'] ?? null, ($__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e = $errors['value'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404], message: 'The value is not a valid choice.'))->choiceViews($value['value'] ?? null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], $value) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[value]", $value['value'] ?? null, ($__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e = $errors['value'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404], message: 'The value is not a valid choice.'))->choiceViews($value['value'] ?? null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], $value); + return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView('value', $value['value'] ?? null, ($__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e = $errors['value'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404]))->choiceViews($value['value'] ?? null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], $value) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[value]", $value['value'] ?? null, ($__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e = $errors['value'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_5c3b6fd1a41b45355826d3a33c0e6c6e : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404]))->choiceViews($value['value'] ?? null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], $value); } function default(?string $rootField = null): Quatrevieux\Form\View\FormView { - return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView('value', null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404], message: 'The value is not a valid choice.'))->choiceViews(null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], []) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[value]", null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404], message: 'The value is not a valid choice.'))->choiceViews(null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], []); + return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView('value', null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404]))->choiceViews(null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], []) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\WithChoiceRequest', ['value' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[value]", null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: ['The answer' => 42, 'The beast' => 666, 'Lost' => 404]))->choiceViews(null, $this->transformer->fieldTransformer('value'), $this->registry), $this->registry->getTranslator())], []); } public function __construct( diff --git a/tests/View/Generator/FormViewInstantiatorGeneratorTest.php b/tests/View/Generator/FormViewInstantiatorGeneratorTest.php index 987eaaf..f204601 100644 --- a/tests/View/Generator/FormViewInstantiatorGeneratorTest.php +++ b/tests/View/Generator/FormViewInstantiatorGeneratorTest.php @@ -229,12 +229,12 @@ class GeneratedFormViewInstantiator implements Quatrevieux\Form\View\FormViewIns function submitted(array $value, array $errors, ?string $rootField = null): Quatrevieux\Form\View\FormView { - return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView('foo', $value['foo'] ?? null, ($__tmp_6f4afa00801630e2315251561e35e48c = $errors['foo'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_6f4afa00801630e2315251561e35e48c : null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView('bar', $value['bar'] ?? null, ($__tmp_2b71b0f6b364f62d6344a8beead6aeb4 = $errors['bar'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_2b71b0f6b364f62d6344a8beead6aeb4 : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48], message: 'The value is not a valid choice.'))->choiceViews($value['bar'] ?? null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], $value) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView("{$rootField}[foo]", $value['foo'] ?? null, ($__tmp_6f4afa00801630e2315251561e35e48c = $errors['foo'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_6f4afa00801630e2315251561e35e48c : null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[bar]", $value['bar'] ?? null, ($__tmp_2b71b0f6b364f62d6344a8beead6aeb4 = $errors['bar'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_2b71b0f6b364f62d6344a8beead6aeb4 : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48], message: 'The value is not a valid choice.'))->choiceViews($value['bar'] ?? null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], $value); + return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView('foo', $value['foo'] ?? null, ($__tmp_6f4afa00801630e2315251561e35e48c = $errors['foo'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_6f4afa00801630e2315251561e35e48c : null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView('bar', $value['bar'] ?? null, ($__tmp_2b71b0f6b364f62d6344a8beead6aeb4 = $errors['bar'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_2b71b0f6b364f62d6344a8beead6aeb4 : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48]))->choiceViews($value['bar'] ?? null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], $value) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView("{$rootField}[foo]", $value['foo'] ?? null, ($__tmp_6f4afa00801630e2315251561e35e48c = $errors['foo'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_6f4afa00801630e2315251561e35e48c : null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[bar]", $value['bar'] ?? null, ($__tmp_2b71b0f6b364f62d6344a8beead6aeb4 = $errors['bar'] ?? null) instanceof \Quatrevieux\Form\Validator\FieldError ? $__tmp_2b71b0f6b364f62d6344a8beead6aeb4 : null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48]))->choiceViews($value['bar'] ?? null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], $value); } function default(?string $rootField = null): Quatrevieux\Form\View\FormView { - return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView('foo', null, null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView('bar', null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48], message: 'The value is not a valid choice.'))->choiceViews(null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], []) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView("{$rootField}[foo]", null, null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[bar]", null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48], message: 'The value is not a valid choice.'))->choiceViews(null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], []); + return $rootField === null ? new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView('foo', null, null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView('bar', null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48]))->choiceViews(null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], []) : new \Quatrevieux\Form\View\FormView('Quatrevieux\\Form\\Fixtures\\SimpleRequest', ['foo' => new \Quatrevieux\Form\View\FieldView("{$rootField}[foo]", null, null, []), 'bar' => (new \Quatrevieux\Form\View\FieldView("{$rootField}[bar]", null, null, []))->choices((new \Quatrevieux\Form\Choice\Choice(choices: [12, 24, 48]))->choiceViews(null, $this->transformer->fieldTransformer('bar'), $this->registry), $this->registry->getTranslator())], []); } public function __construct(