2014-07-18 16 views
5

Attualmente sto cercando di far funzionare i moduli di symfony con il mio post e di mettere a riposo l'endpoint delle API.Come posso far funzionare i moduli Symfony con un'API REST?

Attualmente ho:

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

$form->handleRequest($request); 

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

Tuttavia, la forma non è mai valida. Esaminando il problema, sembra che il campo isSmditted del modulo sia falso, quindi non passa mai la convalida. Inoltre, poiché questa è una chiamata API, ho csrf_protection impostato su false nel tipo di carta di credito.

Ecco un esempio di quello che i dati che sto avendo l'utente conferma:

{ 
    "credit_card": { 
    "name" : "Example Name" 
    ... 
    } 
} 

Come faccio ad avere questo post/put richiesta di essere registrato come presentato e hanno passare il modulo validatore? Grazie.

risposta

5

Sarebbe utile se fosse possibile fornire l'intero codice della classe CreditCardType nonché i dati POST completi e gli errori di convalida dal modulo.

Comunque questo sono le cose che ho trovato per essere la ragione per la forma presentare fallimenti:

  • Invia dati incompleti: se si dispone di un campo sul modulo CerditCardType che è assente sulla vostra richiesta POST, assicurarsi che ha l'opzione 'required' impostata su false.
  • Nome modulo: assicurarsi che tutti i campi siano racchiusi da una proprietà denominata dopo il nome del modulo (il nome fornito sul metodo CreditCardType :: getName()). Nel tuo caso presumo che sia "credit_card".
  • Pubblicare solo i campi definiti nella classe CreditCardType. Se pubblichi un parametro che non corrisponde ad alcun campo del tuo modulo, otterrai un errore di convalida come "Questo modulo non dovrebbe avere campi aggiuntivi" o qualcosa del genere.

Ad ogni modo se fornisci ulteriori informazioni sarei lieto di aiutarti di più.

UPDATE:

Ok, penso che il problema è che si sta scrivendo i dati come una stringa JSON e il metodo handleRequest() non sta ottenendo alcun dato, perché Symfony non sa che dovrebbe essere decodificato dalla richiesta di body (si aspetta che i dati vengano inviati come $ _GET o $ _POST parametri). Quindi devi farlo da solo.

Invece di utilizzare il metodo handleRequest() si deve utilizzare il metodo submit() con i dati ottenuti dalla decodifica del contenuto richiesta ($request->getContent()):

$request = $this->getRequest(); 
$cc = new CreditCard(); 
$form = $this->createForm(new CreditCardType(), $cc); 

// Decode de JSON input 
$data = json_decode($request->getContent(), true); 

// Post the data to the form 
$form->submit($data); 

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

Speranza che aiuta ora!

BTW se si sta lavorando su un'implementazione RESTful si dovrebbe considerare l'utilizzo del pacchetto FOSRestBundle. Gestirebbe per te tutti i formati di logica di conversione e routing, entità de/serializzazione, ecc.

+0

Come ho detto prima, la forma del sottoposto il valore è falso. ho messo un'istruzione die nella funzione submit nella classe Form di symfony e il die non è mai stato attivato. Anche la funzione di invio è l'unica cosa in symfony che imposta inviata a true. Il CreditCardType è esattamente come ci si aspetterebbe da un costruttore che aggiunge i campi, getName restituisce 'credit_card', e data_class è impostato sull'entità della carta di credito. –

+0

@DerickF mi dispiace per quello. Ho confuso isSubmitted() con isValid(). Stai postando i tuoi dati come una stringa JSON? Se è necessario analizzare i contenuti della richiesta per decodificare de JSON e quindi utilizzare tale oggetto come dati del modulo. Fatemi sapere se questo è il caso e posso modificare il mio post con la risposta giusta! –

+0

funziona magnificamente! Grazie! –

5

I tuoi dati non vengono passati correttamente al modulo perché stai passando un oggetto di richiesta che non ha il nome del modulo come chiave.

Quando si crea un form utilizzando Symfony è creare il seguente tipo di array quando POST ing ..

"your_form_name": {   // Given that you forms `getName()` 
          // returns "your_form_name" 
    "field1": "value1", 
    "field2": "value2" 
} 

Quando si utilizza il metodo handleRequest esso uso il nome del modulo come chiave come qui di seguito (per la see github codice completo) ..

if ('GET' === $method) { 
     if ('' === $name) { 
      $data = $_GET; 
     } else { 
      // Don't submit GET requests if the form's name does not exist 
      // in the request 
      if (!isset($_GET[$name])) { 
       return; 
      } 

      $data = $_GET[$name]; 
     } 
    } else { 
     // ... same sort of stuff for $_POST, $_FILES, etc 
    } 

    // ... 

    $form->submit($data, 'PATCH' !== $method); 

Ciò significa che se si invia un array che non contiene il nome del modulo, non viene inviato.

Il modo per aggirare questo sarebbe quella di utilizzare il metodo submit() invece e inviare tutti i dati, piuttosto che i dati con la chiave nome del modulo come ..

$form->submit($request->request->all()); // $_POST 

$form->submit($request->query->all());  // $_GET 
+0

my $ form-> getName() restituisce 'credit_card' e ho provato a passare i dati nel modo specificato (senza parentesi esterne) e ancora non ho avuto fortuna. –

+0

Senza le parentesi esterne? – qooplmao

+0

vedere la mia domanda e i dati di esempio che sto dando. ho rimosso l'esterno "{}" –

Problemi correlati