Symfony2: mon formulaire renvoie la valeur false à partir de isValid() mais tableau vide pour getErrors() à partir de la contrainte unique condition
J'ai un Client entité qui ne dispose que d'un unique champ e-Mail. Je suis en train de modifier un e-mail du client et la validation fonctionne très bien. Cependant, j'ai ceci dans mon controller:
public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AcmeDemoBundle:Customer')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Customer entity.');
}
$editForm = $this->createForm(new CustomerType(), $entity);
$editForm->bind($request);
if ($editForm->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('ticket_result'));
}
var_dump($editForm->getErrors());
return $this->render('AcmeDemoBundle:Customer:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
));
}
Le var_dump renvoie un tableau vide, mais le validateur définit une unique erreur et le $editForm->isValid()
renvoie la valeur false. Est-il un moyen de vérifier que l'erreur spécifique dans le contrôleur lors de la validation, aussi pouvez-vous expliquer pourquoi il renvoie une erreur vide tableau? En gros, j'aimerais donner la "fusion" option si l'erreur vient.
MODIFIER: ici, c'est le formtype:
namespace Acme\DemoBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class CustomerType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('email', 'email', array('required'=>true))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Acme\DemoBundle\Entity\Customer',
'cascade_validation' => true,
));
}
public function getName() {
return 'acme_demobundle_customertype';
}
}
Et le template twig:
{% extends 'AcmeDemoBundle::layout.html.twig' %}
{% block body -%}
<h1>Customer edit</h1>
<form action="{{ path('customer_update', { 'id': entity.id }) }}" method="post" {{ form_enctype(edit_form) }}>
<input type="hidden" name="_method" value="PUT" />
{{ form_widget(edit_form) }}
<p>
<button type="submit">Edit</button>
</p>
</form>
{% endblock %}
Voici ma validation:
Acme\DemoBundle\Entity\Customer:
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: email
message: "A customer under that email address already exists"
properties:
email:
- Email: ~
Est-ce que votre type de clientèle avez des sous-formulaires ?
montrez votre modèle, plz
J'ai mis à jour le post et ajouté la validation, le modèle et le formtype
montrez votre modèle, plz
J'ai mis à jour le post et ajouté la validation, le modèle et le formtype
OriginalL'auteur Boris_bulletdodger | 2013-07-15
Vous devez vous connecter pour publier un commentaire.
À des fins de débogage, vous pouvez utiliser
$form->getErrorsAsString()
au lieu de$form->getErrors()
si vous utilisez Symfony 2.*Cité de cette réponse:
Mise à JOUR 1:
"Avec les plus récentes versions de Symfony, vous devez utiliser
$form->getErrors(true, false);
à la place. Le premier paramètre correspond àdeep
et la deuxième àflatten
" (voir le commentaire de @Roubi)il sera également contenir de l'enfant des formes d'erreurs?
passer l'option param Boolean en cascade par le biais des formulaires enfant $form->getErrors(true);
Avec les plus récentes versions de Symfony, vous devez utiliser
$form->getErrors(true, false);
à la place. Le premier paramètre correspond à profondeur et la deuxième à la aplatir l'OriginalL'auteur Denes Papp
Ok, trouvé une réponse ici:
Symfony2 non valide le formulaire sans erreurs
Il s'avère que chaque enfant a son propre erreurs. Lorsque l'on fait un var_dump de
J'obtiens:
Je me demande encore comment déterminer que l'erreur est en raison d'un conflit sans sans analyse de la chaîne de message d'erreur.
$editForm->getErrors(true)
sera de retour les erreurs de forme des enfants de manière récursive (depuis 2.5).OriginalL'auteur Boris_bulletdodger
Vous pouvez utiliser error_bubbling sur chaque champ de la bulle de l'erreur jusqu'à votre $form.
Si non, vous pouvez également foreach dans les erreurs
OriginalL'auteur Thomas Bennett
Les solutions suivantes fonctionne pour moi:
$form->getErrors(vrai)
OriginalL'auteur Shadi Akil
Dans Symfony 2.3, vous pouvez utiliser celui-ci :
Ainsi, vous obtenez un tableau (
$errors
) avec les erreurs de la part des enfants.OriginalL'auteur numerogeek
Vous pouvez essayer d'utiliser le
dump
fonction lorsque le formulaire est soumis et non valide. Je l'utilise comme ceciNoter que ce n'est à des fins de débogage seulement, Il va vous montrer votre formulaire, les données et toutes les erreurs de champ pourrait avoir.
En mode production, vous devez retourner l'erreur de la vue et de les montrer à l'utilisateur.
OriginalL'auteur Miguel Carvajal