Atributo de campo de formulario de Symfony empty_data ignorado

De acuerdo con la documentación de Symfony 2.4 , cualquier campo de formulario que no sea obligatorio, pero que se envíe sin ningún valor (valor predeterminado para los campos de selección o valor vacío para los campos de texto), se guardará en la entidad con un valor NULO. Por lo tanto, si su campo de entidad se define como NO NULO (por ejemplo, no es nullable = verdadero), cuando persista en la entidad obtendrá un error desagradable:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'shell' cannot be null 

Por lo tanto, la documentación indica que si no desea que use NULL como valor predeterminado, puede especificar el atributo empty_data en un campo de texto o elección. Sin embargo, esto no está funcionando para mí.

Campo de entidad (no anulable):

 /** * @ORM\Column(type="string") */ protected $shell = ''; 

Generador de formularios (no requerido):

 ->add('shell', 'choice', array( 'label' => 'Shell', 'choices' => array('shell' => 'Fancy Pants'), 'required' => false, 'empty_data' => '' )) 

¿Estoy malinterpretando este atributo empty_data ? ¿Me estoy perdiendo algún escenario importante en otro lugar? ¿Cuál es la forma recomendada de hacer esto?

ACTUALIZAR

Este boleto de Github explica que esto fue un problema en 2012, y aún no se ha solucionado.

¿Eso significa que todos los que utilizan el generador de formularios se ven obligados a convertir cualquier campo que no sea obligatorio en un campo que pueda contener nulos? Eso parece bastante criticado para el marco … hay muchas razones por las que no queremos usar NULL cuando un valor predeterminado ” o 0 no tiene un significado único y no necesitamos un NULL. Para muchas consultas, tener que verificar la presencia de ambos campos = 0 O campo = NULL, es un dolor.

¿Hay alguna solución mejor que otras personas estén usando?

Lo hago de la manera sugerida, pero establece un valor predeterminado en la clase Entidad. Así que en lugar de establecer nulo, la Entidad está arreglando que establece 0 o algo más.

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

O bien, puedes cuidarlo en el setter:

 public function setShell($shell) { $this->shell = $shell; if ( !is_numeric($shell) ) { $this->shell = 0; } return $this; } 

Quizás no sea la mejor práctica, pero funciona para no tener valores anulables.

Otra posible solución es crear un DataTransfromer simple y adjuntarlo al campo requerido. Ejemplo:

  

Conecte el transformador a un solo campo:

 $nameSuffix = $builder->create('name_suffix', 'choice', array( 'label' => 'Name Suffix', 'choices' => PR::getSMSFSuffixes(), ))->addModelTransformer(new NullToEmptyTransformer()); $builder->add($nameSuffix); 

Puede desde 2.6, usar una combinación de marcador de posición y datos vacíos en su clase de formulario.

  $builderInterface->add('gender', 'choice', array( 'required' => false, 'choices' => array( 'M' => 'Male', 'F' => 'Female', 'I' => 'I dont want to specify' ), 'placeholder' => 'Choose Gender', 'empty_data' => 'I' ));