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:
1 2 3 4
| {
"content": "Rien que des bla bla bla",
"yewanPost":"/api/yewan_posts/27"
} |
Resultat :
Code:
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:
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 :
Citation:
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 :
Citation:
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:
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
{ |
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:
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
{ |