2012-07-28 6 views
14

Tengo un formulario para crear un nuevo Customer. Un cliente puede tener un número de teléfono móvil. El número de teléfono móvil debe mantenerse sin el prefijo + o 00 que el usuario puede escribir. Esto se puede lograr fácilmente con:¿Cuál es el lugar sugerido para modificar datos de formulario enlazados en Symfony?

$customer->setMobile(preg_replace("/^(\+|00)/", '', $customer->getMobile())); 

¿Cuál es el mejor lugar para poner este código?

  • Dentro de un CustomerController antes de llamar al administrador de la entidad y persistir a la entidad. ¿Es esto realmente una cuestión de un controlador en el patrón MVC?
  • El uso de un SanitizeCustomerSubscriber y escuchar FormEvents:POST_BIND caso
  • uso de un servicio CustomerSanitizer

Cualquier otra idea? Por supuesto, hablo de manipulación de datos en general, el número de móvil es solo un ejemplo: los campos que deben desinfectarse podrían ser más que uno.

Respuesta

42

Debe hacerlo en el evento PRE_BIND, donde puede acceder a los datos enviados antes de que se procese.

$builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) { 
    $data = $event->getData(); 
    if (isset($data['mobile'])) { 
     $data['mobile'] = preg_replace("/^(\+|00)/", '', $data['mobile']); 
    } 
    $event->setData($data); 
}); 

Para el registro, a partir de Symfony 2.3, este evento se llama PRE_SUBMIT.

+0

Tengo ** registerAction en BookController ** que utiliza un evento PRE_SUBMIT similar para manipular los datos del formulario. Yo trabajo bien Pero, después de crear una ** loginAction en SecurityController ** hoy, siempre que presento una acción de inicio de sesión, (control de programa) va al ** evento PRE_SUBMIT ** creado para la acción de registro. ¿Cómo evitar esta interrupción de acción de inicio de sesión con el evento PRE_SUBMIT creado para la acción de registro? ** Nota: ** ambos controladores usan la misma clase de entidad. – webblover

10

Lo pondría en el método CustomersetMobile() - cuanto más cerca de los datos en sí, mejor. De esta forma, el número de móvil se desinfectará sin importar qué controladores o formularios se utilicen para configurarlo.

+0

Además de Bernhard Schussek es el mantenedor de Symfony Form, creo que es mucho mejor (en este caso) hacerlo también en setMobile(). – felipsmartins

Cuestiones relacionadas