IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

subResource API Plateform & Symfony 4


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Par défaut subResource API Plateform & Symfony 4
    Bonjour tout le monde,
    J'éssaie faire un API avec API Plateform sous Symfony 4 où je fait des commentaires (Class Comment) sur des post (class YewanPost). Les commentaires sont faites par des users (class User).
    L'ajout de Commentaire marchent comme je le voudrais car je voudrais afficher le username et fullname de celui (author) qui post un commentaire. Et je l'ai fait en définissant un "groups"={"get-comment-with-author"} dans le normalization_context du collectionOperations : post de la class Comment.
    POST -> http://localhost:8000/api/comments
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
    "content": "Rien que des bla bla bla",
    "yewanPost":"/api/yewan_posts/27"
    }
    Resultat :
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {
        "@context": "/api/contexts/Comment",
        "@id": "/api/comments/27",
        "@type": "Comment",
        "id": 27,
        "content": "Rien que des bla bla bla",
        "createdAt": "2019-12-29T10:08:08+00:00",
        "author": {
            "@id": "/api/users/105",
            "@type": "User",
            "username": "john_doe",
            "fullname": "John Doe"
        }
    }
    Mais, lorsque j'utilise la route de mon subRessource qui liste les commentaires d'un post, le username et fullname de l'auteur (author) du commentaire ne s'affiche pas.
    GET -> http://localhost:8000/api/yewan_posts/27/comments
    Resultat :
    Code json : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    {
        "@context": "/api/contexts/Comment",
        "@id": "/api/yewan_posts/27/comments",
        "@type": "hydra:Collection",
        "hydra:member": [
            {
                "@id": "/api/comments/1",
                "@type": "Comment",
                "id": 1,
                "content": "Très bon produit",
                "parent": null,
                "nbrLike": null,
                "nbrUnlike": null,
                "isUsefull": null,
                "createdAt": "2019-12-22T00:00:00+00:00",
                "author": "/api/users/105",
                "yewanPost": "/api/yewan_posts/27"
            }
        ],
        "hydra:totalItems": 1
    }
    lorsque je fait un php bin/console debug:router, la route la route utilisée est presente :
    api_yewan_posts_comments_get_subresource GET ANY ANY /api/yewan_posts/{id}/comments.{_format}
    C'est cette route qui est vraiment utilisé lors de mon operation GET car dans mon log je vois bien :
    2019-12-29T10:45:05+00:00 [info] Matched route "api_yewan_posts_comments_get_subresource".
    J'ai mis un "groups"={"get-comment-with-author"} dans le normalization_context de la route api_yewan_posts_comments_get_subresource
    dans le collectionOperations de ma classe Comment et mon constat est que il ne le considere même pas et utilise toujours le normalization_context
    de l'opération get.

    Annotation de la classe Comment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    namespace App\Entity;
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Serializer\Annotation\Groups;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * @ApiResource(
     *     itemOperations={
     *         "get",
     *         "put"={
     *             "access_control"="is_granted('IS_AUTHENTICATED_FULLY') and object.getAuthor() == user"
     *         }
     *     },
     *     collectionOperations={
     *         "get",
     *         "post"={
     *             "access_control"="is_granted('IS_AUTHENTICATED_FULLY')",
     *             "normalization_context"={
     *                 "groups"={"get-comment-with-author"}
     *             }
     *         },
     *         "api_yewan_posts_comments_get_subresource"={
     *             "normalization_context"={
     *                 "groups"={"get-comment-with-author"}
     *             }
     *         }
     *     },
     *     denormalizationContext={
     *         "groups"={"post"}
     *     }
     * )
     * @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
     */
    class Comment implements AuthoredEntityInterface, CreatedAtEntityInterface
    {

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Par défaut Mettre une propriété subresourceOperation
    Bonjour,
    J'ai trouvé la solution à mon problème.

    La façon de faire du tuto sur lequel je me base n'est plus apprécié. En me reférant sur ce qui est sur leur documentation actuelle, il fallait mettre une propriété subresourceOperation à l'annotation @ApiResource().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    namespace App\Entity;
     
    use ApiPlatform\Core\Annotation\ApiResource;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Serializer\Annotation\Groups;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * @ApiResource(
     *     itemOperations={
     *         "get",
     *         "put"={
     *             "access_control"="is_granted('IS_AUTHENTICATED_FULLY') and object.getAuthor() == user"
     *         }
     *     },
     *     collectionOperations={
     *         "get",
     *         "post"={
     *             "access_control"="is_granted('IS_AUTHENTICATED_FULLY')",
     *             "normalization_context"={
     *                 "groups"={"get-comment-with-author"}
     *             }
     *         }
     *     },
     *     subresourceOperations={
     *         "api_yewan_posts_comments_get_subresource"={
     *             "method"="GET",
     *             "normalization_context"={"groups"={"get-comment-with-author"}}
     *         }
     *     },
     *     denormalizationContext={
     *         "groups"={"post"}
     *     }
     * )
     * @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
     */
    class Comment implements AuthoredEntityInterface, CreatedAtEntityInterface
    {

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion api plateform avec sql-server
    Par Moctarelemane dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/02/2019, 10h18
  2. Connexion entre api plateforme et visuel studio
    Par Moctarelemane dans le forum C#
    Réponses: 0
    Dernier message: 16/02/2019, 01h07
  3. [2.x] api Rest et Symfony
    Par dukoid dans le forum Symfony
    Réponses: 5
    Dernier message: 15/02/2016, 10h15
  4. Réponses: 8
    Dernier message: 14/08/2007, 13h14
  5. Quelle api de fenêtrage pour du multi-plateforme ?
    Par Mindiell dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 29/01/2007, 17h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo