2014-03-07 16 views
5

Das Formular ist nie gültig, aber $form->getErrors() gibt keinen Fehler. Da sein gonna ein REST-API mit DEV HTTP-ClientREST form validation in symfony 2 - wie test post

Testdaten

Kopf sein testen: Content-Type:application/json

Körper: {"username":"sad","password":"123","email":"[email protected]"}

Ich habe keine Jede Validation.yml-Datei

Gibt es irgendeine Methode, um herauszufinden, was schief läuft (Fehlermeldung)?

public function postUserAction(Request $request) 
{ 

    return $this->processForm(new User(),$request); 
} 

private function processForm(User $user, Request $request) 
{ 


    $form = $this->createForm(new UserType(), $user); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 

     return array('form' => 'valid'); 
    } 

    return \FOS\RestBundle\View\View::create($form->getErrors(),400); 
} 

Antwort

3

Nach einem kleinen debug: isValid() prüft, bildet mehrere Dinge, zum Beispiel, wenn das Formular abgeschickt wurde. Es war nicht, also änderte ich zu

... 
     $form = $this->createForm(new UserType(), $user); 
     //$form->handleRequest($request); 
     $form->submit($request); 

     if ($form->isValid()) { 
... 

jetzt seine Gültigkeit.

+2

Sie möglicherweise Kann handleRequest() weiterhin verwenden, wenn Sie dem optionalen dritten Parameter createForm einige Optionen hinzufügen, wie array ("method" => "POST"). Es war die einzige Möglichkeit, das Formular mithilfe von handleRequest() zu übergeben. Ich ging die extra Meile, um handleRequest() zu arbeiten, weil submit() mit einer $ -Anfrage aufgerufen wurde, da ein Argument in Symfony 2.3 abgesetzt wird und anscheinend in 3.0 verschwunden sein wird. –

1

Wenn eine Validierung Form Debuggen

Verwendung $form->getErrorsAsString() statt $form->getErrors().

(, die in zu tiefer Ebene einschließlich der Form Kinder laufen.)

+0

danke. Es sieht so aus, als gäbe es keinen Fehler: "form": "Benutzername: \ n Keine Fehler \ nKennwort: \ n Keine Fehler \ nemail: \ n Keine Fehler \ n", aber das Formular ist immer noch inValid ... – user1930254

1

Dieser arbeitete für mich:

$form = $this->createForm(new UserType(), $user); 
$jsonData = json_decode($request->getContent(), true); // "true" to get an associative array 

if ('POST' === $request->getMethod()) { 
    $form->bind($jsonData); 
    ... 
} 
0

Ich bin spät, um diese zu antworten, aber, alle Antworten sind falsch. submit sollte vermieden werden und stattdessen handleRequest verwenden. Read this. Diese Form war nicht gültig mit handleRequest weil UserType wurde einen der nächsten fehlt:

  1. Ein Formularfeld
  2. Ein Formularfeld war nicht in geeignetem Format
  3. In UserType Klasse getName Funktion fehlte sollte leer zurückkehren String und csrf_protection sollten deaktiviert werden (wenn Sie API Ansatz verwenden, wo formnot generated von Ihrem Symfony2 Projekt war):

    public function configureOptions(OptionsResolver $resolver) 
    { 
        $resolver->setDefaults(array(
         'data_class' => 'UserApiBundle\Entity\User', 
         'csrf_protection' => false, 
        )); 
    } 
    
    public function getName() 
    { 
        return ''; 
    } 
    

    submit würde nicht dafür prüfen, und es ist ein schlechter Ansatz für POST. Sie könnten es für PUT Anfrage verwenden, um eine User zu aktualisieren, wobei password Feld nicht für xyz Gründe (ex: Berechtigungen) eingereicht werden.

    $form->submit($request, false); 
    

Es ist schwer für form Fehler in Symfony2 zu graben.Sie können diese Funktion verwenden, um Fehler zu erhalten:

public function getErrors($form) 
{ 
    $errors = array(); 
    foreach ($form as $fieldName => $formField) { 
     $currentError = $formField->getErrors(); 

     if ($currentError->current()) { 
      $current = $currentError->current(); 
      $errors[$fieldName] = $current->getMessage(); 
     } 
    } 

    return $errors; 
}