Installer une application API Platform (Symfony) React avec Symfony CLI

Si vous ne l’avez pas déjà fait téléchargez symfony CLI sur le site officiel. C’est un binaire donc en fonction de votre plateforme, ce n’est pas le même programme.

Un peit mot avnagt de commencer,ici on va installer API Platform en tant que bundle de Symfony, et ReactJS dans un répertoire indépendant. Symfony propose aussi d’installer ReactJS comme un greffon de Twig, personnellement je n’ai pas réussi à le faire marcher, les composants ne se renderisaient pas. Je préfère quand le front et le back sont séparés (pas de monorepo), car le webservice doit servir d’autres plateformes (mobile par exemple)

Vérifiez que vous êtes en PHP 8.2 (Recommandé)

symfony new bookshop-api
cd bookshop-api

Etape importante installation du bundle:

symfony composer require api

Création de la base de donnée:

symfony console doctrine:database:create
symfony console doctrine:schema:create

// si vous avez des soucis sous MAMP pour créer la base de données, sachez que e port de MySQL n'est aps 3306 et 


Puis lancement du serveur avec Symfony CLI
symfony serve

Accéder à votre site

Symfony CLI va vous donner votre url pour le site. Il faut savoir qu’avec API Platform, vous n’avez pas de front end pour votre site. Le front end va être assuré par ReactJs qui sera complètement indépendant dans sa structure de fichiers d’API Platform.

http://localhost:8000/

Votre webservice est accessible à l’url http://localhost:8000/api ! cela intéresse ReactJS. Voici ce que vous verrez si vous accéder à cette url.

L’interface que vous voyez est Swagger, une librairie de documentation interactive de votre webservice. Il est important lorsque vous travaillez avec API Platform que vous devez oubliez ce que vous avez appris avec une application Symfony classique sauf pour les entités.

Création d’une entité Book

Copiez le code suivant (extrait de la documentation officielle)

<?php
// src/Entity/Book.php
namespace App\Entity;

use ApiPlatform\Metadata\ApiResource;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/** A book. */
#[ORM\Entity]
#[ApiResource]
class Book
{
    /** The ID of this book. */

    #[ORM\Id, ORM\Column, ORM\GeneratedValue]
    private ?int $id = null;

    /** The ISBN of this book (or null if doesn't have one). */
    #[ORM\Column(nullable: true)]
    public ?string $isbn = null;

    /** The title of this book. */
    #[ORM\Column]
    public string $title = '';

    /** The description of this book. */
    #[ORM\Column(type: 'text')]
    public string $description = '';

    /** The author of this book. */
    #[ORM\Column]
    public string $author = '';

    /** The publication date of this book. */
    #[ORM\Column]
    public ?\DateTimeImmutable $publicationDate = null;

    /** @var Review[] Available reviews for this book. */
    #[ORM\OneToMany(targetEntity: Review::class, mappedBy: 'book', cascade: ['persist', 'remove'])]
    public iterable $reviews;

    public function __construct()
    {
        $this->reviews = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }
}

Allez maintenant dans l’adresse de la documentation de votre API http://localhost:8000/api

Créez une seconde entité Review

<?php
// src/Entity/Review.php
namespace App\Entity;

use ApiPlatform\Metadata\ApiResource;
use Doctrine\ORM\Mapping as ORM;

/** A review of a book. */
#[ORM\Entity]
#[ApiResource]
class Review
{
    /** The ID of this review. */
    #[ORM\Id, ORM\Column, ORM\GeneratedValue]
    private ?int $id = null;

    /** The rating of this review (between 0 and 5). */
    #[ORM\Column(type: 'smallint')]
    public int $rating = 0;

    /** The body of the review. */
    #[ORM\Column(type: 'text')]
    public string $body = '';

    /** The author of the review. */
    #[ORM\Column]
    public string $author = '';

    /** The date of publication of this review.*/
    #[ORM\Column]
    public ?\DateTimeImmutable $publicationDate = null;

    /** The book this review is about. */
    #[ORM\ManyToOne(inversedBy: 'reviews')]
    public ?Book $book = null;

    public function getId(): ?int
    {
        return $this->id;
    }
}

Voici ce que vous devriez voir dans la documentation

Les annotation Doctrines sont déjà présentes dans le code car je les ai déjà ajoutées. Vous devez les ajouter pour toute nouvelle entité que vous créez. C’et nécessaire pour faire la migration et ainsi créer des tables dans la base de données.

php bin/console make:entity --api-resource.  // permet d'annoter

Migration vers la base de données

Tapes les lignes suivantes pour faire la migration

bin/console doctrine:migrations:diff
bin/console doctrine:migrations:migrate

Si la migration des tables est faites sans problème nous allons pouvoir commencer !

Opération CRUD avec Swagger

Nous n’allons pas Postman pour faire nos requêtes AJAX mais directement dans Swagger, c’est l’intérêt de l’outil.

Allez dans Swagger, Book puis cliquez sur POST, une fenêtre se déroule, cliquez sur “Try it out”. Collez le json suivant dans le champs “Request body”

{
  "isbn": "9781782164104",
  "title": "Persistence in PHP with the Doctrine ORM",
  "description": "This book is designed for PHP developers and architects who want to modernize their skills through better understanding of Persistence and ORM.",
  "author": "Kévin Dunglas",
  "publicationDate": "2013-12-01"
}

Puis cliquez sur Execute.

Vérifiez que dans la table Book vous avez une entrée correspondante. Passez à l’insertion d’une review

{
  "book_id": "/books/1", // ou "/api/books/1
  "rating": 5,
  "body": "Interesting book!",
  "author": "Kévin",
  "publicationDate": "September 21, 2016"
}

Ici on a saisi directement l’id du Book, dnas la réalité, vous devez faire un GET des Book, puis lire l’id de celui que vous voulez faire une Review.

A propos de l'auteur

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *