2013-12-13 5 views
8

long story short: Utilizzo di FOSRestBundle Sto tentando di creare alcune entità tramite chiamata POST o modificare esistente tramite PUT.FosRestBundle post/put [crea nuovo/aggiornamento entità] non letto Richiesta corretta

qui il codice:

/** 
* Put action 
* @var Request $request 
* @var integer $id Id of the entity 
* @return View|array 
*/ 
public function putCountriesAction(Request $request, $id) 
{ 
    $entity = $this->getEntity($id); 
    $form = $this->createForm(new CountriesType(), $entity, array('method' => 'PUT')); 
    $form->bind($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 
     return $this->view(null, Codes::HTTP_NO_CONTENT); 
    } 

    return array(
     'form' => $form, 
    ); 
} //[PUT] /countries/{id} 

Se chiamo/paesi/{id} con PUT passare un JSON come { "description": "Il Giappone"}, ne modifica il mio paese con id = 1, mettendo una descrizione vuota.

Se, invece, cerco di creare una nuova entità con questo metodo:

/** 
* Create new Countries (in batch) 
* @param Request $request json request 
* @return array   redirect to get_coutry, will show the newly created entities 
*/ 
public function postCountriesAction(Request $request) 
{ 
    $entity = new Countries(); 
    $form = $this->createForm(new CountriesType(), $entity); 
    $form->bind($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirectView(
      $this->generateUrl(
       'get_country', 
       array('id' => $entity->getId()) 
      ), 
      Codes::HTTP_CREATED 
     ); 
    } 

    return array(
     'form' => $form, 
    ); 
} //[PUT {"description":"a_description"}] /countries 

mi dà un errore che dice:

exception occurred while executing 'INSERT INTO countries (description) VALUES (?)' with params [null]: 
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'description' cannot be null 

così sembra che io non sono in grado di passare correttamente la richiesta di associare al modulo.

Si noti che se ho json_decode la richiesta come suggerito here si risponde con un

{ 
    "code":400, 
    "message":"Validation Failed", 
    "errors":{ 
     "errors":[ 
      "This value is not valid." 
     ], 
     "children":{ 
      "description":[ 
      ] 
     } 
    } 
} 

qualche consiglio?

Grazie, Rolls

risposta

21

ho risolto :)

questo è il motivo per cui c'è bisogno d funzionato prima:

Nella mia definizione del modulo il nome era "zanzibar_backendbundle_countries".

public function getName() 
{ 
    return 'zanzibar_backendbundle_countries'; 
} 

Quindi, per legare una richiesta a questa forma JSON dovrebbe hanno guardato come questo:

{"zanzibar_backendbundle_countries": [{"description": "Japan"}]} 

Dal momento che ho voluto che fosse qualcosa come

{"id":1,"description":"Italy"} 

ho dovuto togliere il nome dal modulo:

public function getName() 
{ 
    return ''; 
} 

In generale, se si desidera inviare un JSON con un segnaposto come

"something":{"key":"value"} 

tuo nome modulo deve essere esattamente "qualcosa"

0

Prova questo:

if ($form->isValid()) { 
    $entity = $form->getData();  // <------ you didn't bind entity to the form 
    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 
+0

purtroppo questo non fa il trucco ... Sembra i' Non sono in grado di associare la richiesta al modulo ... cosa ho [dal debug]: 'richiesta: PUT' ' richiesta: Array ([descrizione] => Giappone) ' ' entità da db: Paesi Oggetto ([id: protected] => 1; [descrizione: protected] => Italia) ' ' da form-> getData() form: Paesi Oggetto <- ([id: protected] => 1; [description: protected] =>) cosa salva: entity: Countries Object ([id: protected] => 1; [description: protected] =>) ' – rollsappletree

Problemi correlati