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)
Démarrage du projet
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.
