Données POST à ??manipuler le travail avec des formes Symfony2 lorsqu'il est utilisé dans une API REST

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

  •  25-10-2019
  •  | 
  •  

Question

Arrière-plan:

Je suis en train d'écrire une API RESTful sur symfony. Je veux que le client soit en mesure d'afficher une URL en utilisant l'application type de contenu / JSON et afficher un objet JSON de la forme que l'action du contrôleur recherche.

Im en utilisant une configuration de contrôleur assez basique pour cela. Laisse supposer à des fins de démonstration qui im ??essayant d'authentifier un combo simple mot de passe nom d'utilisateur.

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

Maintenant, la question que j'ai et ai-je ai essayé var_dumping ce jusqu'à ce que les vaches rentrent à la maison, est que pour ce que jamais symfony raison ne veut pas prendre l'application / JSON contenu corps et utiliser ces données pour alimenter la forme données.

Nom du formulaire: api_apiuser

Les champs: nom d'utilisateur, mot de passe

Quelle serait la meilleure façon de gérer ce type de tâche. Je suis ouvert aux suggestions aussi longtemps que je peux obtenir ce travail. Merci pour votre temps avec la question.

Était-ce utile?

La solution 2

Ive effectivement trouvé une manière similaire à résoudre ce problème, après avoir vérifié si la méthode est post et avant de se lier à la demande à la forme que je fais ceci:

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 **/
}

Autres conseils

Youll besoin d'accéder au corps de la demande RAW, puis utilisez json_decode. Vous aurez besoin probablement changer votre méthode de bindRequest à quelque chose comme ce qui suit:

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

Je nai vraiment foiré avec SF2 pourtant si cela est devinettes basé sur l'API, exp. avec sf1.x et les choses ive recueilli des présentations sur le cadre. Il pourrait aussi être préférable de faire une méthode complètement différente comme bindJsonRequest si les choses sont un peu plus propre.

Oui, ce que la forme attend pendant la liaison est un tableau contenant les clés qui correspondent à vos propriétés ApiUser.

Donc, si vous envoyez une demande POST avec la chaîne:

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

Vous devrez le transformer en un tableau en utilisant json_decode par exemple:

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

Ensuite, vous liez ce tableau à la forme en utilisant $form->bind($data);

Le formulaire mettra à jour vos propriétés ApiUser correspondant aux clés de tableau (nom d'utilisateur, mot de passe).

Si vous construisez une RESTful JSON api, je vous conseille d'automatiser ce processus en utilisant sérialiseurs / transformateurs, comme https://github.com/schmittjoh/JMSSerializerBundle/blob/master/Resources/doc/index.rst

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top