Subressource pour lire les messages

Nous avons une route POST /discussions/{id}/messages pour créer un message sur une discussion

Nous allons créer la route GET /discussions/{id}/messages pour lire messages de la discussion

Pour ce faire nous nous rendons dans notre entité Discussion et on déclare l'attribut messages comme une Subresource

use ApiPlatform\Core\Annotation\ApiSubresource;

//...

/**
 * @ORM\OneToMany(targetEntity=Message::class, mappedBy="discussion", orphanRemoval=true)
 * @ApiSubresource()
 */
private $messages;

C'est tout. Vous pouvez maintenant faire un GET /discussions/{id}/messages et vous obtiendrez tous les messages en lien avec la discussion

Voici un exemple de retour que vous devriez avoir

{
    "@context": "/api/contexts/Message",
    "@id": "/api/discussions/94/messages",
    "@type": "hydra:Collection",
    "hydra:member": [
        {
            "@id": "/api/messages/78",
            "@type": "Message",
            "id": 78,
            "content": "Ex quaerat amet numquam aut minima beatae. Accusamus et exercitationem quasi nulla magnam sit nihil provident voluptatem. Assumenda totam ipsum repudiandae quae amet repellat velit quas voluptatem. Iure eaque soluta pariatur. Enim qui atque.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/80",
            "@type": "Message",
            "id": 80,
            "content": "Fugit a quis ipsum. Hic hic ipsam laborum modi quos esse nihil. Laborum eum inventore alias quos repellendus omnis ut. Sint cumque asperiores. Numquam est saepe omnis nulla pariatur aperiam vel sit non. Eius voluptates id velit voluptatum tempore voluptatem non eos officia.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/81",
            "@type": "Message",
            "id": 81,
            "content": "Velit odio sed. Commodi asperiores quia amet neque laborum accusantium. Voluptas eius necessitatibus sint illum consequatur ullam eum. Nemo ut excepturi. Consequatur provident doloremque. Libero aperiam consequatur minima omnis illum nesciunt sunt.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/82",
            "@type": "Message",
            "id": 82,
            "content": "Temporibus alias est neque quisquam expedita consectetur omnis at voluptas. Ut qui ducimus soluta. Libero quia rerum. Rerum laboriosam quia inventore doloremque reiciendis. Occaecati ut tenetur.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/83",
            "@type": "Message",
            "id": 83,
            "content": "Tempora quod repudiandae nostrum. Nesciunt unde repudiandae maiores at et. Qui consequatur ea numquam est veritatis vel qui. Voluptas architecto aliquid dolores et. Ut sed numquam rerum impedit voluptas provident id dolor earum. Ab ratione facere dolores ea dolore perspiciatis magni saepe.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/84",
            "@type": "Message",
            "id": 84,
            "content": "Eum odit magnam quia ad. Et impedit deleniti doloribus rerum temporibus rerum eos quos. Sit dolorem qui ut sunt nostrum nulla. Porro repellendus qui deleniti mollitia excepturi accusamus esse sint dignissimos. Aut ut impedit quia vel est.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/85",
            "@type": "Message",
            "id": 85,
            "content": "Quo est ipsam rerum rerum possimus ea. Hic aut numquam architecto sit. Et illo at repudiandae quis est quaerat atque porro.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/86",
            "@type": "Message",
            "id": 86,
            "content": "Facilis nisi mollitia ut necessitatibus explicabo veniam. Eligendi ratione sunt voluptas est consequatur expedita fuga ut. Officia necessitatibus maiores cumque.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/87",
            "@type": "Message",
            "id": 87,
            "content": "Iusto quo nam et odio est rem quos maxime. Nesciunt porro dolor velit commodi aut officiis non praesentium. Dolore qui voluptas non aliquid autem vel sint officiis itaque. Eveniet nulla velit amet et.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/88",
            "@type": "Message",
            "id": 88,
            "content": "Sit voluptatum similique mollitia ipsa et atque est quos. Est qui consequatur voluptatem et. Enim tempora sit accusamus quibusdam adipisci repellendus. Iste sit doloremque et reiciendis sunt amet autem.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/92",
            "@type": "Message",
            "id": 92,
            "content": "Possimus sapiente suscipit numquam ut sed. Cum aspernatur id doloremque distinctio est ut ratione omnis optio. Sint laudantium atque sed voluptatem tempora debitis ad.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/93",
            "@type": "Message",
            "id": 93,
            "content": "Hic quis atque maxime quo ad consequuntur et sit. Fugiat fugit praesentium ipsum. Perspiciatis consequatur autem fuga. In similique dignissimos temporibus iure non officiis vitae mollitia totam. Cumque officia rerum sunt deleniti molestiae molestiae. In deserunt voluptas quisquam.",
            "discussion": "/api/discussions/94"
        }
    ],
    "hydra:totalItems": 12
}

Il nous reste un point qu'on peut améliorer.

On peut définir l'ordre en dur dans notre ressource avec l'attribut order mais celui-ci ne pourra pas être changé par le client

/**
 * @ApiResource(order={"id":"desc"})
 * @ORM\Entity(repositoryClass=MessageRepository::class)
 */
class Message

Ou si vous voulez que le client puisse choisir on peut utiliser le filtre OrderFilter

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass=MessageRepository::class)
 * @ApiFilter(OrderFilter::class)
 */
class Message

Et pour choisir l'ordre on ajoute le paramètre order dans l'url : GET /api/discussions/94/messages?order[id]=desc

Et nous avons comme réponse

{
    "@context": "/api/contexts/Message",
    "@id": "/api/discussions/94/messages",
    "@type": "hydra:Collection",
    "hydra:member": [
        {
            "@id": "/api/messages/93",
            "@type": "Message",
            "id": 93,
            "content": "Hic quis atque maxime quo ad consequuntur et sit. Fugiat fugit praesentium ipsum. Perspiciatis consequatur autem fuga. In similique dignissimos temporibus iure non officiis vitae mollitia totam. Cumque officia rerum sunt deleniti molestiae molestiae. In deserunt voluptas quisquam.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/92",
            "@type": "Message",
            "id": 92,
            "content": "Possimus sapiente suscipit numquam ut sed. Cum aspernatur id doloremque distinctio est ut ratione omnis optio. Sint laudantium atque sed voluptatem tempora debitis ad.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/88",
            "@type": "Message",
            "id": 88,
            "content": "Sit voluptatum similique mollitia ipsa et atque est quos. Est qui consequatur voluptatem et. Enim tempora sit accusamus quibusdam adipisci repellendus. Iste sit doloremque et reiciendis sunt amet autem.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/87",
            "@type": "Message",
            "id": 87,
            "content": "Iusto quo nam et odio est rem quos maxime. Nesciunt porro dolor velit commodi aut officiis non praesentium. Dolore qui voluptas non aliquid autem vel sint officiis itaque. Eveniet nulla velit amet et.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/86",
            "@type": "Message",
            "id": 86,
            "content": "Facilis nisi mollitia ut necessitatibus explicabo veniam. Eligendi ratione sunt voluptas est consequatur expedita fuga ut. Officia necessitatibus maiores cumque.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/85",
            "@type": "Message",
            "id": 85,
            "content": "Quo est ipsam rerum rerum possimus ea. Hic aut numquam architecto sit. Et illo at repudiandae quis est quaerat atque porro.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/84",
            "@type": "Message",
            "id": 84,
            "content": "Eum odit magnam quia ad. Et impedit deleniti doloribus rerum temporibus rerum eos quos. Sit dolorem qui ut sunt nostrum nulla. Porro repellendus qui deleniti mollitia excepturi accusamus esse sint dignissimos. Aut ut impedit quia vel est.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/83",
            "@type": "Message",
            "id": 83,
            "content": "Tempora quod repudiandae nostrum. Nesciunt unde repudiandae maiores at et. Qui consequatur ea numquam est veritatis vel qui. Voluptas architecto aliquid dolores et. Ut sed numquam rerum impedit voluptas provident id dolor earum. Ab ratione facere dolores ea dolore perspiciatis magni saepe.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/82",
            "@type": "Message",
            "id": 82,
            "content": "Temporibus alias est neque quisquam expedita consectetur omnis at voluptas. Ut qui ducimus soluta. Libero quia rerum. Rerum laboriosam quia inventore doloremque reiciendis. Occaecati ut tenetur.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/81",
            "@type": "Message",
            "id": 81,
            "content": "Velit odio sed. Commodi asperiores quia amet neque laborum accusantium. Voluptas eius necessitatibus sint illum consequatur ullam eum. Nemo ut excepturi. Consequatur provident doloremque. Libero aperiam consequatur minima omnis illum nesciunt sunt.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/80",
            "@type": "Message",
            "id": 80,
            "content": "Fugit a quis ipsum. Hic hic ipsam laborum modi quos esse nihil. Laborum eum inventore alias quos repellendus omnis ut. Sint cumque asperiores. Numquam est saepe omnis nulla pariatur aperiam vel sit non. Eius voluptates id velit voluptatum tempore voluptatem non eos officia.",
            "discussion": "/api/discussions/94"
        },
        {
            "@id": "/api/messages/78",
            "@type": "Message",
            "id": 78,
            "content": "Ex quaerat amet numquam aut minima beatae. Accusamus et exercitationem quasi nulla magnam sit nihil provident voluptatem. Assumenda totam ipsum repudiandae quae amet repellat velit quas voluptatem. Iure eaque soluta pariatur. Enim qui atque.",
            "discussion": "/api/discussions/94"
        }
    ],
    "hydra:totalItems": 12,
    "hydra:view": {
        "@id": "/api/discussions/94/messages?order%5Bid%5D=desc",
        "@type": "hydra:PartialCollectionView"
    },
    "hydra:search": {
        "@type": "hydra:IriTemplate",
        "hydra:template": "/api/discussions/94/messages{?order[id],order[content]}",
        "hydra:variableRepresentation": "BasicRepresentation",
        "hydra:mapping": [
            {
                "@type": "IriTemplateMapping",
                "variable": "order[id]",
                "property": "id",
                "required": false
            },
            {
                "@type": "IriTemplateMapping",
                "variable": "order[content]",
                "property": "content",
                "required": false
            }
        ]
    }
}

Notez que maintenant notre filtre qui définit l'ordre est affiché à la fin de la requête

prev next

Commentaires

Connectez-vous pour laisser un commentaire