Forma Symfony: personalize o setter que é chamado

Eu tenho um tipo de formulário personalizado do Symfony para uma entidade.

Eu quero personalizar o código que é executado quando o formulário é enviado, mas apenas para um campo.

Por exemplo, a Symfony irá, por padrão, chamar isso:

$entity->setFoo($value); 

Quero ligar em vez disso:

 $entity->doSomething($value, true); 

Como posso fazer isso sem afetar todas as outras propriedades que estão corretamente mapeadas com o formulário?

Você pode definir o seu campo foo no formulário como not mapped e, em seguida, adicionar ouvinte no POST_SUBMIT que chamará seu método doSomething() :

 $builder->add('foo', null, array('mapped' => false)) ; $builder->addEventListener( FormEvents::POST_SUBMIT, function(FormEvent $event) { $entity = $event->getForm()->getData(); $entity->doSomething($event->getForm()->get('foo')->getData(), true); } ); 

Não chamará $entity->setFoo($value) . Em vez disso, ele chamará $entity->doSomething($value, true) como você quisesse.

Verifique esta postagem sobre o DataMapper (ele começa a explicar Objetos de Valor, mas o link irá rolar até o header dos Data Mappers diretamente). É muito útil, mas perdeu nos documentos do Symfony.