Bearbeiten von POST-Daten, um mit Symfony2-Formularen zu funktionieren, wenn sie in einer REST-API verwendet werden

StackOverflow https://stackoverflow.com/questions/9304214

  •  25-10-2019
  •  | 
  •  

Frage

Hintergrund:

Ich schreibe eine RESTful-API auf Symfony.Ich möchte, dass der Client in der Lage ist, unter Verwendung des Inhaltstyps „application/json“ auf einer URL zu posten und ein JSON-Objekt in der Form zu posten, nach der die Controller-Aktion sucht.

Ich verwende dafür ein ziemlich einfaches Controller-Setup.Nehmen wir zu Demonstrationszwecken an, dass ich versuche, eine einfache Kombination aus Benutzername und Passwort zu authentifizieren.

public function loginAction( Request $request )
{
    $user = new ApiUser();
    $form = $this->createForm(new ApiUserType(), $user);
    if ( "POST" == $request->getMethod() ) {
        $form->bindRequest($request);
        if ( $form->isValid() ) {
            $em = $this->getDoctrine()->getEntityManager();
            $repo = $this->getDoctrine()->getRepository('ApiBundle:ApiUser');
            $userData = $repo->findOneByUsername($user->getUsername());
            if ( is_object($userData) ) {
                /** do stuff for authenticating **/
            }
            else{
                return new Response(json_encode(array('error'=>'no user by that username found')));
            }
        else{
            return new Response(json_encode(array('error'=>'invalid form')));
        }
    }
}

Nun ist das Problem, das ich habe, und ich habe versucht, es mit var_dumping zu versehen, bis die Kühe nach Hause kommen, darin, dass Symfony aus irgendeinem Grund nicht den Anwendungs-/JSON-Inhaltskörper nehmen und diese Daten zum Auffüllen der Formulardaten verwenden möchte.

Formularname:api_apiuser

Felder:Benutzername Passwort

Was wäre der beste Weg, diese Art von Aufgabe zu bewältigen?Ich bin offen für Vorschläge, solange ich das zum Laufen bringen kann.Vielen Dank, dass Sie sich die Zeit genommen haben.

War es hilfreich?

Lösung 2

Ich habe tatsächlich einen ähnlichen Weg gefunden, dies zu beheben. NACHDEM ich überprüft habe, ob die Methode post ist, und bevor ich die Anfrage an das Formular gebunden habe, mache ich Folgendes:

if ( "POST" === $request->getMethod() ) {
    if (0 === strpos($request->headers->get('Content-Type'), 'application/json')){
        $data = json_decode($request->getContent(), true);
        $request->request->replace(is_array($data) ? $data : array());
    }
    $form->bindRequest($request);
    /** Rest of logic **/
}

Andere Tipps

Sie müssen auf den RAW-Anfragetext zugreifen und dann json_decode verwenden.Sie müssen wahrscheinlich Ihre ändern bindRequest Methode zu etwas wie dem Folgenden:

public function bindRequest(Request $request) 
{
       if($request->getFormat() == 'json') {
           $data = json_decode($request->getContent());
           return $this->bind($data);
        } else {
           // your standard logic for pulling data form a Request object
           return parent::bind($request);
        }
}

Ich habe mich noch nicht wirklich mit SF2 beschäftigt, also ist das eher eine Vermutung basierend auf der API, exp.mit sf1.x und Dingen, die ich aus Präsentationen zum Framework gesammelt habe.Es könnte auch besser sein, eine völlig andere Methode zu verwenden, z bindJsonRequest So ist alles etwas aufgeräumter.

Ja, worauf das Formular während der Bindung wartet, ist ein Array mit Schlüsseln, die Ihren ApiUser-Eigenschaften entsprechen.

Wenn Sie also eine POST-Anfrage mit der Zeichenfolge senden:

{ username: 'user', password: 'pass' }

Sie müssen es mit in ein Array umwandeln json_decode Zum Beispiel:

$data = json_decode($request->getContent()); // $request->request->get('json_param_name');

Dann binden Sie dieses Array mit an das Formular $form->bind($data);

Das Formular aktualisiert Ihre ApiUser-Eigenschaften entsprechend den Array-Schlüsseln (Benutzername, Passwort).

Wenn Sie eine RESTful-JSON-API erstellen, würde ich Ihnen raten, diesen Prozess mithilfe von Serialisierern/Transformern zu automatisieren https://github.com/schmittjoh/JMSSerializerBundle/blob/master/Resources/doc/index.rst

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top