9. Récupérer une ressource

On va maintenant se contenter de récupérer une seule ressource, en se basant sur son identifiant.

 

Modifions notre PhoneController

On va ici ajouter une méthode, appelée show, à notre PhoneController :

- cette méthode prendra en paramètre l'identifiant du téléphone (qui est unique)

- la méthode de requête utilisée sera GET

- elle prendra en paramètre une entité Phone

Voici notre code actualisé : 

<?php

namespace App\Controller;

use App\Entity\Phone;
use App\Repository\PhoneRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;

/**
 * @Route("/api/phones")
 */
class PhoneController extends AbstractController
{

    /**
     * @Route("/{page<\d+>?1}", name="list_phone", methods={"GET"})
     */
    public function index(Request $request, PhoneRepository $phoneRepository, SerializerInterface $serializer)
    {
        $page = $request->query->get('page');
        if(is_null($page) || $page < 1) {
            $page = 1;
        }
        $phones = $phoneRepository->findAllPhones($page, getenv('LIMIT'));
        $data = $serializer->serialize($phones, 'json');
        return new Response($data, 200, [
            'Content-Type' => 'application/json'
        ]);
    }

    /**
     * @Route("/{id}", name="show_phone", methods={"GET"})
     */
    public function show(Phone $phone, PhoneRepository $phoneRepository, SerializerInterface $serializer)
    {
        $phone = $phoneRepository->find($phone->getId());
        $data = $serializer->serialize($phone, 'json');
        return new Response($data, 200, [
            'Content-Type' => 'application/json'
        ]);
    }

}

Retournez sur Postman, et accédez à l'url http://localhost:8000/api/phones/1 et admirez le résultat 😄

Nan mais attends, on a encore la liste qui s'affiche, c'est quoi ce bazar ?

Effectivement, on a un point qui cloche, corrigeons-le 😉

 

Si vous regardez bien, vous devez remarquer que c'est la route list_phone qui est appelée.
Passons notre méthode show avant. Retournez sur Postman et actualisez votre page.


Que s'est-il passé ? Ici, la route appelée est bien celle qu'on veut, mais il nous indique ne pas connaître l'entité Phone.

Mais attends, c'est pas Symfony qui devrait retrouver l'identifiant passé comme attribut de l'entité Phone ?

Oui, effectivement. C'est le bundle SensioFrameworkExtraBundle qui nous permet de faire ceci. Lancez la commande : 

composer require annotations

 Retournez maintenant sur Postman et actualisez votre requête. 


On récupère bien notre seule ressource, via son identifiant passé en paramètre 😅

 

Et si on essayait de récupérer une ressource avec un identifiant inexistant ? Par exemple le téléphone avec l'id 123 ?

Essayez d'accéder à l'URL http://localhost:8000/api/phones/123 :


Une belle erreur s'affiche. On va pour le moment la laisser de côté, on reviendra dessus d'ici peu.

On va d'abord mettre en place des groupes de sérialisation.