Explication des différentes étapes:
Il suffit d'éxécuter cette commande dans le terminal pour créer le projet Symfony avec tous les paquets de base.
Avant de continuer il faut aller dans le fichier .env afin de rentrer notre connexion à la base de données en remplacant db_user, db_password et db_name par nos propres informations.
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7
Une fois le projet initié, nous avons créé les deux entités "Post" et "Commentaire" nécessaires pour notre api blog. Nous avons utilisé la ligne de commande :
Il y a une relation OneToMany entre l'entité Post et l'entité Commentaire (ce qui crée un attribut "post" dans l'entité Commentaire).
Quand les attributs de chaque entité ont été renseigné il nous reste à faire la migration vers la base de données.
On commence par faire le fichier de migrations avec la ligne de commande:
Une fois ce fichier créé il nous reste plus qu'a éxécuter cette migrations à l'aide de cette commande:
On utilise composer pour installer Api Platform dans notre projet Symfony.
Symfony sait directement à quel bundle on fait appelle avec cette commande.
De base Api Platform renvoi du json+ld, mais dans notre cas il nous faut seulement du json. Pour ce faire on se rend dans le fichier "api_platform.yaml" ( config > api_platform.yaml ) en précisant le format que l'on souhaite:
api_platform:
mapping:
paths: ['%kernel.project_dir%/src/Entity']
patch_formats:
json: ['application/merge-patch+json']
swagger:
versions: [3]
formats:
json:
mime_types:
- application/json
html:
mime_types:
- text/html
Quand le format est choisi on peut commencer à créer notre API. Avec Api Platform rien de plus simple, dans nos entités il suffit de rajouter un use:
use ApiPlatform\Core\Annotation\ApiFilter;
et de faire nos réglages selon ce que l'on souhaite avoir en ajoutant des annotations au dessus de nos Classes:
/**
* @ORM\Entity(repositoryClass=CommentaireRepository::class)
* @ApiResource(
* attributes={
* "order"={"createdAt":"DESC"}
* },
* normalizationContext={"groups"={"read:commentaire"}},
* collectionOperations={"get", "post"},
* itemOperations={"get"}
* )
* @ApiFilter(SearchFilter::class,
* properties={"post": "exact"}
* )
*/
class Commentaire
{......
Le simple fait de rajouter l'annotation @ApiResource()
crée l'API directement, dans les parenthèses ce sont les différents paramètres que l'on peut rajouter.
Dans notre exemple ci-dessus:
attributes={"order"={"createdAt":"DESC"}}
grâce à cette annotation on aura les derniers Post et/ou Commentaire qui seront affichés en premier.normalizationContext={"groups"={"read:post"}}
nous permet de créer des groupes, et au dessus des attributs que l'on veut afficher on rajoute l'annotation* @Groups({"read:commentaire"})
collectionOperations={"get", "post"}
cette annotation nous permet de dire à Api Platform quelle méthode on souhaite utiliser, ici on veut que les méthodes GET et POST.itemOperations={"get"}
ceci nous permet d'avoir une méthode GET pour un Commentaire en particulier en utilisant son {id}. C'est la même annotation pour la classe Post.@ApiFilter(SearchFilter::class,properties={"post": "exact"})
à l'aide de ce filtre on affiche uniquement les commentaires reliés à un post.
En installant Api Platform, le bundle Nelmio Cors est installé également, ce qui nous permet d'éviter les erreurs CORS. Il y a quelques réglages à faire. On se rend dans le fichier config>nelmio_cors.yaml et on change " allow_origin " et allow_headers " :
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['*']
allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
allow_headers: ['*']
expose_headers: ['Link']
max_age: 3600
paths:
'^/': null
Dans le fichier .env il y a également une ligne qui a été rajouté automatiquement:
CORS_ALLOW_ORIGIN=^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$
Avec tous ces réglages l'API est fonctionnelle !