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
Resultat :
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" }
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.
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" } }
GET -> http://localhost:8000/api/yewan_posts/27/comments
Resultat :
lorsque je fait un php bin/console debug:router, la route la route utilisée est presente :
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 }
C'est cette route qui est vraiment utilisé lors de mon operation GET car dans mon log je vois bien :api_yewan_posts_comments_get_subresource GET ANY ANY /api/yewan_posts/{id}/comments.{_format}
J'ai mis un "groups"={"get-comment-with-author"} dans le normalization_context de la route api_yewan_posts_comments_get_subresource2019-12-29T10:45:05+00:00 [info] Matched 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 {
Partager