À propos de - Créez une API REST avec Symfony 3

Intégration d'angularJS dans l'api

a marqué ce sujet comme résolu.

Salut à tous,

J'ai eu un problème avec le tuto "À propos de - Créez une API REST avec Symfony 3", j'ai donc poser ma question en MP à l'auteur du tuto BestCoder qui a résolu mon problème. Afin que d'autres puissent aussi en profiter, je place ici l'historique de la conversion :

Moi :

Salut,

Je tiens d'abord à te dire merci pour ce super tutoriel. Après avoir fouiller le web comme un chien affamé à la recherche de ne ce resqu'un os, je suis content d'avoir trouvé mon bonheur. Franchement c'est le meilleur tutoriel sur Fosrestbundle que j'ai trouvé jusqu'ici. C

Cependant, j'ai eu à adapter ton projet sur un projet personnel et j'ai pu avec succès construire une api fonctionnel. Maintenant, je ne sais pas comment afficher une page html afin de travailler avec AngularJS en front-end, puisque toutes les routes communiquent avec l'api.

Peux-tu m'aider s'il te plaît ?

Mille fois merci par avance

BestCoder :

Salut,

Tout d'abord merci.

Si tu veux que les pages html soient affichées par ton application, il faut changer les urls de ton api. Tu peux par exemple ajouter un préfixe /api dans toutes les routes de ton api, et configurer FOSREstBundle pour qu'il soit actif que sur ces routes.

La déclaration des routes pourrait ressembler à :

1
2
3
4
places:
    type:     rest
    resource: AppBundle\Controller\PlaceController
    prefix: /api

La configuration de FOSRestBundle devra prendre en compte les nouvelles routes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# src/app/config/config.yml
fos_rest:
    routing_loader:
        include_format: false
    view:
        view_response_listener: true
    zone:
        - { path: ^/api }
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json'], fallback_format: 'json' }

La partie zone permet d'activer le bundle que pour les routes commençants par api. IL ne faut pas aussi oublier de reconfigurer la partie sécurité pour qu'elle corresponde aux nouvelles urls.

PS : Il est préférable de poser les questions sur le forum pour que tout le monde puisse en profiter.

Cordialement.

+3 -0

Salut !

Peut-être que ce post aurait plus sa place en dessous du tuto en question ?

mrBen

J'ai toujours imaginé les commentaires sur les tutoriels comme l'endroit où on peut poser des questions sur la forme et le fond, or là on est plus dans la demande d'aide pour réaliser un point particulier. Donc le forum est un bon endroit, à mon avis.

Je recommanderais cependant d'ajouter les tags [symfony][rest] au sujet ;)

+1 -0

Je pense aussi à rajouter une petite FAQ dans le tuto pour expliquer rapidement ce genre de cas. J'ai conçu le tuto en considérant que l'application Symfony ne permettra de gérer que la partie API mais souvent elle est aussi utilisée pour gérer les vues JS/HTML d'où ce type de question.

Bonjour, je poste un échange que j'ai eu avec BestCoder par MP :

Bonjour,

D'abord merci pour ce super tutoriel.

Ensuite je voulais te faire part d'un problème que je rencontre avec la sécurisation de l'api, en effet la méthode getPlainPassword n'est pas reconnue dans le contrôleur, un message m'indique que la méthode n'est pas dans l'entité Utilisateur, pourtant tu indique bien que l'attribut plainPassword n'est pas sauvegardé en base et du coup quand je mets à jour la bd ça génère bien la password et pas plainPassword et quand je génère les entities, plainPssword n'a pas de getters et setters… Je te laisse voir le code en bas, j'ai dû rater une étape surement mais pourtant vérifier plusieurs fois et j'ai pas l'impression d'avoir omis quelque chose…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$form->submit($request->request->all());

        if ($form->isValid()){
            $encoder = $this->get('security.password_encoder');
            // le mot de passe en claire est encodé avant la sauvegarde
            $encoded = $encoder->encodePassword($utilisateur, $utilisateur->getPlainPassword());
            $utilisateur->setPassword($encoded);

            $em = $this->get('doctrine.orm.entity_manager');
            $em->persist($utilisateur);
            $em->flush();
            return $utilisateur;
        } else {
            return $form;
        }

Salut,

Il est toujours préférable de poser les questions sur le forum afin que tout le monde puisse t'aider et profiter de la réponse.

Pour le comportement du champ plainPassword c'est normal. On ne stocke jamais le mot de passe en clair dans la base de données. C'est marqué dans le tutoriel.

L'attribut plainPassword ne sera pas sauvegardé en base. Il nous permettra de conserver le mot de passe de l'utilisateur en clair à sa création ou modification. Partie "Login et mot de passe pour les utilisateurs"

Pour les getters et setters de plainPassword, il faut les créer manuellement. La commande generate entities ne gére que les attributs avec des annotations Doctrine. Et ici, on ne veut pas que doctrine gére l'attribut plainPassword pour nous.

Bonjour,

Je rencontre un soucis avec le format "datetime" lors des post, j'ai le message suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
"dateinscri": {
        "errors": [
          "This value is not valid."
        ],
        "children": {
          "date": {
            "children": {
              "year": {},
              "month": {},
              "day": {}
            }
          },
          "time": {
            "children": {
              "hour": {},
              "minute": {}
            }
          }
        }
      },

Pourtant j'entre bien un datetime au bon format :

1
"dateinscri": "2016-11-25 12:00:00",

J'ai meme essayé tous les formats de la doc php…

Auriez-vous svp une idées d'où pourrait provenir le problème ?

Ton problème n'est pas lié au REST mais à l'utilisation même de Symfony. Pour que les dates soient considérées comme un seul champ, il faut utilisé l'option date_widget et le mettre à single_text.

Le format de validation pourra ainsi être défini en utilisant l'option format.

PS : J'insiste quand même sur le fait que les questions doivent être posées sur le forum.(edit: dans un nouveau sujet)

Cordialement.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte