it-swarm.com.de

Symfony2: Mein Formular gibt false von isValid () zurück, aber leeres Array für getErrors () von der Bedingung für eindeutige Bedingungen

Ich habe eine Kundeneinheit, die nur ein eindeutiges E-Mail-Feld hat. Ich versuche, die E-Mail eines Kunden zu bearbeiten, und die Validierung funktioniert einwandfrei. Ich habe jedoch folgendes in meinem 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(),
    ));
}

Var_dump gibt ein leeres Array zurück, aber der Prüfer legt einen eindeutigen Fehler fest, und $editForm->isValid() gibt false zurück. Gibt es eine Möglichkeit, diesen spezifischen Fehler im Controller während der Validierung zu überprüfen. Können Sie auch erklären, warum ein leeres Fehlerarray zurückgegeben wird? Grundsätzlich möchte ich die Option "Zusammenführen" bereitstellen, wenn der Fehler auftritt.

BEARBEITEN: hier ist der Formtyp:

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';
    }
}

Und die Zweigvorlage:

{% 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 %}

Hier ist meine Bestätigung:

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: ~
15

Ok, hier eine Antwort gefunden:

Symfony2 ungültiges Formular ohne Fehler

Es stellt sich heraus, dass jedes Formular-Kind seine eigenen separaten Fehler hat. Bei einem var_dump von 

$editForm->getChildren()['email']->getErrors()

Ich bekomme:

array (size=1)
  0 => 
    object(Symfony\Component\Form\FormError)[531]
      private 'message' => string 'A customer under that email address already exists' (length=50)
      protected 'messageTemplate' => string 'A customer under that email address already exists' (length=50)
      protected 'messageParameters' => 
        array (size=0)
          empty
      protected 'messagePluralization' => null

Ich frage mich immer noch, wie ich feststellen kann, dass der Fehler auf einen eindeutigen Konflikt zurückzuführen ist, ohne die Fehlernachrichtenzeichenfolge zu analysieren. 

4

Zu Debug-Zwecken können Sie $form->getErrorsAsString() anstelle von $form->getErrors() verwenden, wenn Sie Symfony 2 verwenden. *

Zitiert aus dieser Antwort :

$form->getErrorsAsString() sollte nur zum Debuggen des Formulars verwendet werden ... it enthält die Fehler aller untergeordneten Elemente, was nicht der Fall ist von $ form-> getErrors ().


UPDATE 1:

"Bei neueren Symfony-Versionen müssen Sie stattdessen $form->getErrors(true, false); verwenden. Der erste Parameter entspricht deep und der zweite flatten" (siehe den Kommentar von @Roubi).

21
Denes Papp

Sie können error_bubbling für jedes Feld verwenden, um den Fehler in Ihr $ -Formular zu sprudeln.

Wenn nicht, können Sie auch die Fehler durchgehen

foreach ($children as $child) {
            if ($child->hasErrors()) {
                $vars = $child->createView()->getVars();
                $errors = $child->getErrors();
                foreach ($errors as $error) {
                    $this->allErrors[$vars["name"]][] = $this->convertFormErrorObjToString($error);
                }
            }
}
1
Thomas Bennett

Die folgenden Lösungen funktionieren für mich:

$ form-> getErrors (true)

1
Shadi Akil

In Symfony 2.3 können Sie Folgendes verwenden:

if ($form->isValid()){
    # Code...
} else {
    foreach ($form->getIterator() as $key => $child) {
        if ($child instanceof Form) {
            foreach ($child->getErrors() as $error) {
                $errors[$key] = $error->getMessage();
            }
        }
    }
}

Dadurch erhalten Sie ein Array ($errors) mit den Fehlern der untergeordneten Elemente.

0
numerogeek

Sie können versuchen, die Funktion dump zu verwenden, wenn das Formular übermittelt wird und nicht gültig ist. Ich benutze es so

if($form->isSubmited() && $form->isValid()){
   //SAVE TO DATABASE AND DO YOUR STUFF
}else if($form->isSubmited()){
  //SUBMITED BUT WITH ERRORS
   dump($form->getErrors(true));
   die();

}

Beachten Sie, dass dies nur zu Debugging-Zwecken dient. Es zeigt Ihnen Ihr Formular, die darin enthaltenen Daten und alle Fehler an, die jedes Feld haben könnte. Im Produktionsmodus sollten Sie den Fehler an die Ansicht zurückgeben und dem Benutzer anzeigen.

0
Miguel Carvajal