Extender EntityType para permitir opciones adicionales configuradas con llamadas AJAX

Intento crear un tipo personalizado de Symfonyextensible el núcleo "entidad" tipo.

Pero quiero usarlo conSelect2 versión 4.0.0 (ajax ahora funciona con el elemento html "select" y no con la "entrada" oculta como antes).

Este tipo debería crear una selección vacía en lugar de la lista completa de entidades por el tipo de "entidad" extendida.

Esto funciona configurando la opción (ver configureOption):

'choices'=>array()
Al editar el objeto adjunto al formulario, debe completar la selección con los datos actuales del objeto. Resolví este problema pero solo para la vista con el siguiente método buildView ...

Select2 reconoce el contenido del html "select", y hace su trabajo con ajax. Pero cuando el formulario se vuelve a publicar, Symfony no reconoce las opciones seleccionadas (¿porque no se permitieron?)

Symfony\Component\Form\Exception\TransformationFailedException

    Unable to reverse value for property path "user": The choice "28" does not exist or is not unique

Probé varios métodos usando EventListeners o Subscribers pero no puedo encontrar una configuración que funcione.

Con Select2 3.5. * Resolví el problema con eventos de formulario y anulando el tipo de formulario oculto, pero aquí extender el tipo de entidad es mucho más difícil.

¿Cómo puedo construir mi tipo para permitirle administrar la transformación inversa de mis entidades?

Tipo personalizado:

<?php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\ChoiceList\View\ChoiceView;

class AjaxEntityType extends AbstractType
{
    protected $router;

    public function __construct($router)
    {
        $this->router = $router;
    }

   /**
    * {@inheritdoc}
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
        $builder->setAttribute('attr',array_merge($options['attr'],array('class'=>'select2','data-ajax--url'=>$this->router->generate($options['route']))));
    }

    /**
    * {@inheritdoc}
    */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['attr'] = $form->getConfig()->getAttribute('attr');
        $choices = array();
        $data=$form->getData();
        if($data instanceOf \Doctrine\ORM\PersistentCollection){$data = $data->toArray();}
        $values='';
        if($data != null){
            if(is_array($data)){
                foreach($data as $entity){
                    $choices[] = new ChoiceView($entity->getAjaxName(),$entity->getId(),$entity,array('selected'=>true));
                }
            }
            else{
                $choices[] = new ChoiceView($data->getAjaxName(),$data->getId(),$data,array('selected'=>true));
            }
        }

        $view->vars['choices']=$choices;
    }

   /**
    * {@inheritdoc}
    */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setRequired(array('route'));
        $resolver->setDefaults(array('choices'=>array(),'choices_as_value'=>true));
    }

    public function getParent() {
        return 'entity';
    }

    public function getName() {
        return 'ajax_entity';
    }
}

Formulario principal

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class AlarmsType extends AbstractType
{
   /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name','text',array('required'=>false))
            ->add('user','ajax_entity',array("class"=>"AppBundle:Users","route"=>"ajax_users"))
            ->add('submit','submit');
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'AppBundle\Entity\Alarms','validation_groups'=>array('Default','form_user')));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'alarms';
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta