Aquí está mi saveAction
código (donde el formulario pasa los datos)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Mi pregunta es: ¿cómo obtengo los errores si $form->isValid()
devuelve false
?
error_bubbling
en verdadero en su tipo de formulario estableciendo explícitamente la opción para todos y cada uno de los campos.$form->getErrors(true)
incluir errores de formularios secundariosSymfony 2.3 / 2.4:
Esta función obtiene todos los errores. Los del formulario como "El token CSRF no es válido. Intente volver a enviar el formulario". así como errores adicionales en los hijos del formulario que no tienen ningún error de propagación.
Para obtener todos los errores como una cadena:
Symfony 2.5 / 3.0:
Documentos:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (en la parte inferior:
The method Form::getErrorsAsString() was removed
)fuente
$errors[$child->getName()] = $this->getErrorMessages($child);
estaba lanzando una excepción, ya getErrorMessages le faltaba a Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller componente. Así que lo reemplacé con$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
y pensé que se llama directamente dentro de un controlador y parte de la api de Symfony.A continuación se muestra la solución que funcionó para mí. Esta función está en un controlador y devolverá una matriz estructurada de todos los mensajes de error y el campo que los causó.
Symfony 2.0:
Symfony 2.1 y versiones posteriores:
fuente
$this->getFormErrors
debe haber un error tipográfico$this->getErrorMessages
en tu muestra en Symfony2.1Use el Validador para obtener los errores de una entidad específica
Referencia de API:
fuente
Para obtener mensajes adecuados (traducibles), actualmente usando SF 2.6.3, aquí está mi función final (ya que ninguna de las anteriores parece funcionar):
ya que el método Form :: getErrors () ahora devuelve una instancia de FormErrorIterator , a menos que cambie el segundo argumento ($ flatten) a verdadero . (Luego devolverá una instancia de FormError , y tendrá que llamar al método getMessage () directamente, sin el método current ():
)
En realidad, lo más importante es establecer el primer argumento en verdadero para obtener los errores. Dejar el segundo argumento ($ flatten) en su valor predeterminado ( verdadero ) devolverá instancias de FormError , mientras que devolverá instancias de FormErrorIterator cuando se establezca en falso.
fuente
Por mis mensajes flash con los que estaba feliz
$form->getErrorsAsString()
Editar (de Benji_X80): para uso de SF3
$form->getErrors(true, false);
fuente
This method should only be used to help debug a form.
( fuente )La función para Symfony 2.1 y versiones posteriores, sin ninguna función obsoleta:
fuente
IF
declaración? ¿Por qué es mutuamente excluyente? Por lo que puedo ver: el formulario puede tener sus propios errores, así como los hijos.Mensajes de error de formulario traducidos (Symfony2.1)
He estado luchando mucho para encontrar esta información, así que creo que definitivamente vale la pena agregar una nota sobre la traducción de errores de formulario.
@Icode4food
La respuesta devolverá todos los errores de un formulario. Sin embargo, la matriz que se devuelve no tiene en cuenta ni la pluralización ni la traducción del mensaje .Puede modificar el bucle foreach de
@Icode4food
respuesta para tener un combo:Aquí está:
Esta respuesta se ha elaborado a partir de 3 publicaciones diferentes:
fuente
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Sospecho que esto es solo para Symfony 2.1.SYMFONY 3.X
Otros métodos SF 3.X dados aquí no me funcionaron porque podía enviar datos vacíos al formulario (pero tengo restricciones NotNull / NotBlanck). En este caso, la cadena de error se vería así:
Lo cual no es muy útil. Entonces hice esto:
Lo que devolvería eso:
fuente
También puede utilizar el servicio de validación para obtener infracciones de restricciones:
fuente
Mensajes de error de formulario traducidos (Symfony2.3)
Mi versión de resolver el problema:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
En Symfony 2.5 puede obtener errores de todos los campos muy fácilmente:
fuente
Para Symfony 3.2 y superior use esto,
Utilice str_replace si desea deshacerse del molesto texto ' Error: ' en cada texto de descripción de error.
fuente
Si está utilizando validadores personalizados, Symfony no devuelve errores generados por esos validadores en
$form->getErrors()
.$form->getErrorsAsString()
devolverá todos los errores que necesite, pero desafortunadamente su salida está formateada como una cadena, no como una matriz.El método que utilice para obtener todos los errores (independientemente de su procedencia) depende de la versión de Symfony que esté utilizando.
La mayoría de las soluciones sugeridas implican la creación de una función recursiva que escanea todos los formularios secundarios y extrae los errores relevantes en una matriz. Symfony 2.3 no tiene la
$form->hasChildren()
función, pero la tiene$form->all()
.Aquí hay una clase de ayuda para Symfony 2.3, que puede usar para extraer todos los errores de cualquier formulario. (Se basa en el código de un comentario de yapro sobre un ticket de error relacionado en la cuenta de github de Symfony).
Código de llamada:
fuente
Basado en la respuesta de @Jay Seth, hice una versión de la clase FormErrors especialmente para Ajax Forms:
Uso (por ejemplo, en su acción):
Versión de Symfony: 2.8.4
Ejemplo de respuesta JSON:
El objeto de error contiene el campo "clave", que es la identificación del elemento DOM de entrada, por lo que puede completar fácilmente los mensajes de error.
Si tiene formularios secundarios dentro del formulario principal, no olvide agregar la
cascade_validation
opción dentro del formulario principalsetDefaults
.fuente
Para Symfony 2.1 en adelante para su uso con la visualización de errores de Twig, modifiqué la función para agregar un FormError en lugar de simplemente recuperarlos, de esta manera tienes más control sobre los errores y no tienes que usar error_bubbling en cada entrada individual. Si no lo configura de la siguiente manera, {{form_errors (form)}} permanecerá en blanco:
fuente
$ form-> getErrors () funciona para mí.
fuente
Se me ocurrió esta solución. Funciona perfectamente con el último Symfony 2.4 .
Intentaré dar algunas explicaciones.
Usando un validador separado
Creo que es una mala idea usar una validación separada para validar entidades y devolver mensajes de violación de restricciones, como lo sugirieron otros escritores.
Necesitará validar manualmente todas las entidades, especificar grupos de validación, etc. Con formas jerárquicas complejas no es práctico en absoluto y se les escapará de las manos rápidamente.
De esta manera, estará validando el formulario dos veces: una vez con el formulario y una vez con un validador separado. Esta es una mala idea desde la perspectiva del desempeño.
Sugiero iterar recursivamente el tipo de formulario con sus hijos para recopilar mensajes de error.
Usando algunos métodos sugeridos con declaración IF exclusiva
Algunas respuestas sugeridas por otros autores contienen declaraciones IF mutuamente excluyentes como esta:
if ($form->count() > 0)
oif ($form->hasChildren())
.Por lo que puedo ver, todos los formularios pueden tener errores al igual que los niños. No soy un experto con el componente Symfony Forms , pero en la práctica no obtendrá algunos errores del formulario en sí, como el error de protección CSRF o el error de campos adicionales . Sugiero eliminar esta separación.
Usando estructura de resultado desnormalizada
Algunos autores sugieren poner todos los errores dentro de una matriz simple. Entonces, todos los mensajes de error del formulario en sí y de sus hijos se agregarán a la misma matriz con diferentes estrategias de indexación: basados en números para los propios errores del tipo y basados en nombres para los errores secundarios. Sugiero utilizar la estructura de datos normalizada del formulario:
De esa manera, el resultado se puede iterar fácilmente más adelante.
Mi solución
Así que aquí está mi solución a este problema:
Espero que ayude a alguien.
fuente
SYMFONY 3.1
Simplemente implementé un método estático para manejar la visualización de errores.
Esperando ayudar
fuente
Symfony 3 y más reciente
Recientemente hice una función que crea un árbol de errores de forma. Esto será útil para devolver la lista de errores al front-end. Esto se basa en los tipos de formulario que tienen:
Código:
Salida:
Aviso : Sé que los errores de los campos de nivel más profundo se pueden sobrescribir si el nivel superior tiene errores, pero esto es a propósito para mi uso.
fuente
Para Symfony 2.1:
Esta es mi solución final juntando muchas otras soluciones:
fuente