Después de horas de depurar el vendor/symfony/form/Form completo, solo pude descubrir que FormEvents::SUBMIT convierte mi valor null en Object .
Este es mi código.
$form = $this->createForm(PersonType::class, new Person()); $form->submit($request->request->all(), false); if ($form->isSubmitted() && $form->isValid()) { $em->persist($entity); $em->flush(); return $entity; } return $form->getErrors(true, true);Entonces envío esta solicitud.
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185 { "name": {"firstName": "John", "lastName": "Doe"} } Establece el nombre de la persona en John Doe .
Ahora quiero aclararlo:
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185 { "name": null } Y et voilà: El nombre sigue siendo John Doe .
Estoy usando un tipo personalizado:
class NameType extends AbstractType { private EntityManagerInterface $manager; public function __construct(EntityManagerInterface $manager) { $this->manager = $manager; } public function buildForm(FormBuilderInterface $builder, array $options) { parent::buildForm($builder, $options); $builder ->add('firstName', TextType::class) ->add('lastName', TextType::class) ; $builder->addModelTransformer(new NameTransformer($this->manager)); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Name::class, 'compound' => true ]); } }Y se utiliza a través de:
$builder ->add('name', NameType::class) ;Algunas informaciones más:
Si estás publicando
{ "name": null } Ese es el formulario principal que está vacío, por lo que sin los campos del formulario secundario no ha pasado ningún valor para los campos ni los campos en sí. No envía un nuevo valor para los campos, por lo que no se cambia nada.
Creo que debe establecer explícitamente cada uno de los valores de campo individuales en null para que esto funcione. Uno de los siguientes ejemplos debería hacer el truco:
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185 { "name": {"firstName": null, "lastName": null} }o
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185 { "name": {"firstName": "", "lastName": ""} }