SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Guilhem Bourgoin Développeur Symfony Freelance
Une API REST vite fait bien
fait avec API-Platform 2
Introduction
API : Application Programming Interface
=> Point d’entrée permettant à un logiciel d’offrir des services à d'autres logiciels.
REST : Representational State Transfer
=> Chaque ressource doit avoir un identifiant unique (URI).
=> Utilisation du protocole HTTP pour la manipulation des ressources.
=> Les ressources doivent être liées les unes aux autres par des liens.
API REST ?
Installation et configuration
Installation
1 composer create-project symfony/skeleton:4.1.* api-demo
cd api-demo/
composer req api
.env :
DATABASE_URL=mysql://root@127.0.0.1:3306/api-demo
php bin/console doctrine:database:create
2
3
4
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use DoctrineORMMapping as ORM;
/**
* @ApiResource
* @ORMEntity
*/
class Book
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
*/
private $title;
/**
* @ORMManyToOne(targetEntity="Editor", inversedBy="books")
* @ORMJoinColumn(nullable=false)
*/
private $editor;
Entity Book
use ApiPlatformCoreAnnotationApiResource;
/**
* @ApiResource
* @ORMEntity
*/
class Editor
{
/**
* [...]
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
*/
private $name;
/**
* @ORMOneToMany(targetEntity="Book", mappedBy="editor")
*/
private $books;
public function __construct()
{
$this->books = new ArrayCollection();
}
Entity Editor
php bin/console doctrine:schema:update --force
Paramétrages
Paramétrage - Validation
/**
* @ORMColumn(type="string", length=255, nullable=false)
* @AssertNotBlank
* @AssertLength(max=255)
*/
private $title;
/**
* @ORMManyToOne(targetEntity="Editor", inversedBy="books")
* @ORMJoinColumn(nullable=false)
* @AssertNotNull
*/
private $editor;
Paramétrage - Validation
Paramétrage - filtres de recherche
/api/books?title=martine
/api/books?editor.name=Galimard
/api/books?editor.name=Galimard&title=martine
/**
* @ApiResource
* @ApiFilter(SearchFilter::class, properties={
* "title": "partial",
* "editor.name": "exact"
* })
* @ORMEntity
*/
class Book
Paramétrage - filtres de recherche
Search Filter
?property=value
exact - partial - start - end - word_start
Numeric Filter
Boolean Filter
Range Filter
Exists Filter
Order Filter
Custom Filter
Date Filter
?property[<after|before|strictly_after|strictly_before>]=value
Paramétrage - Opérations
/**
* @ApiResource(
* collectionOperations={"get"},
* itemOperations={"get"}
* )
* @ORMEntity
*/
class Book
Paramétrage - Sous ressources
/**
* @ApiResource
* @ORMEntity
*/
class Editor
{
[...]
/**
* @ORMOneToMany(targetEntity="Book", mappedBy="editor")
* @ApiSubresource
*/
private $books;
Paramétrage
Sérialization
/**
* @ApiResource(
* normalizationContext={"groups"={"book_read"}},
* denormalizationContext={"groups"={"book_write"}}
* )
* @ORMEntity
*/
class Book
{
/**
* @Groups({"book_read"})
*/
private $id;
/**
* @Groups({"book_read", "book_write"})
*/
private $title;
/**
* @Groups({"book_read", "book_write"})
*/
private $editor;
Paramétrage - Sérialization, lecture
normalizationContext={"groups"={"book_read"}}
{
"id": 1,
"title": "Da Vinci Code",
"editor": "/api/editors/1"
}
normalizationContext={"groups"={"book_read", "editor_read"}}
{
"id": 1,
"title": "Da Vinci Code",
"editor": {
"id": 1,
"name": "Gallimard"
}
}
Paramétrage - format de communication
Les évènements
Pour aller plus loin
Filtres par défaut
Pagination des listes
Format custom
FOS User Bundle integration
Authentification JWT
Gestion des rôles
Pour aller plus loin
FetchEager
Behat et Behatch
Documentation Swagger / Nelmio
GraphQL support
Schema.org
Back Office en React
Conclusion
+
Rapide et facile à mettre en place
Souple et paramétrable
Communauté active
Préconisé par SensioLabs
-
Quelques bugs
Doc relativement peu à jour
Guilhem Bourgoin Développeur Symfony Freelance
Merci :)
A vos questions !
Annexes
JSON for Linked Data
=> Développé par Google.
=> Recommandé par le W3C depuis 2014.
=> JSON Standard avec des clés spéciales pour décrire le contexte
=> Compatible avec les technologies existantes
JSON-LD
{
"@context": "/api/contexts/Book",
"@id": "/api/books/1",
"@type": "Book",
"id": 1,
"title": "Da Vinci Code",
"editor": "/api/editors/1"
}

Contenu connexe

Similaire à Une API REST vite fait bien fait avec API-Platform 2

20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
PHPPRO
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturite
Rémi Alvado
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv Ps
Gregory Renard
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
goldoraf
 

Similaire à Une API REST vite fait bien fait avec API-Platform 2 (20)

ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturite
 
Quelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application webQuelle place pour le framework Rails dans le développement d'application web
Quelle place pour le framework Rails dans le développement d'application web
 
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
Collab365 - Office 365 API & PowerShell : Le meilleur des deux mondes!
 
Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015Enrichir vos contenus Wordpress avec les API - WPTech 2015
Enrichir vos contenus Wordpress avec les API - WPTech 2015
 
UserGroup Varnish - eZ
UserGroup Varnish - eZUserGroup Varnish - eZ
UserGroup Varnish - eZ
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09Chef - Paris BlockCamp - Nov 09
Chef - Paris BlockCamp - Nov 09
 
Refined, des types sur mesure
Refined, des types sur mesureRefined, des types sur mesure
Refined, des types sur mesure
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
eServices-Tp5: api management
eServices-Tp5: api managementeServices-Tp5: api management
eServices-Tp5: api management
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Asp Au Service Des Mv Ps
Asp Au Service Des Mv PsAsp Au Service Des Mv Ps
Asp Au Service Des Mv Ps
 
Exploiter php 5
Exploiter php 5Exploiter php 5
Exploiter php 5
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 

Une API REST vite fait bien fait avec API-Platform 2

  • 1. Guilhem Bourgoin Développeur Symfony Freelance Une API REST vite fait bien fait avec API-Platform 2
  • 3. API : Application Programming Interface => Point d’entrée permettant à un logiciel d’offrir des services à d'autres logiciels. REST : Representational State Transfer => Chaque ressource doit avoir un identifiant unique (URI). => Utilisation du protocole HTTP pour la manipulation des ressources. => Les ressources doivent être liées les unes aux autres par des liens. API REST ?
  • 5. Installation 1 composer create-project symfony/skeleton:4.1.* api-demo cd api-demo/ composer req api .env : DATABASE_URL=mysql://root@127.0.0.1:3306/api-demo php bin/console doctrine:database:create 2 3 4
  • 6. namespace AppEntity; use ApiPlatformCoreAnnotationApiResource; use DoctrineORMMapping as ORM; /** * @ApiResource * @ORMEntity */ class Book { /** * @ORMId * @ORMColumn(type="integer") * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @ORMColumn(type="string", length=255) */ private $title; /** * @ORMManyToOne(targetEntity="Editor", inversedBy="books") * @ORMJoinColumn(nullable=false) */ private $editor; Entity Book
  • 7. use ApiPlatformCoreAnnotationApiResource; /** * @ApiResource * @ORMEntity */ class Editor { /** * [...] */ private $id; /** * @ORMColumn(type="string", length=255) */ private $name; /** * @ORMOneToMany(targetEntity="Book", mappedBy="editor") */ private $books; public function __construct() { $this->books = new ArrayCollection(); } Entity Editor
  • 10. Paramétrage - Validation /** * @ORMColumn(type="string", length=255, nullable=false) * @AssertNotBlank * @AssertLength(max=255) */ private $title; /** * @ORMManyToOne(targetEntity="Editor", inversedBy="books") * @ORMJoinColumn(nullable=false) * @AssertNotNull */ private $editor;
  • 12. Paramétrage - filtres de recherche /api/books?title=martine /api/books?editor.name=Galimard /api/books?editor.name=Galimard&title=martine /** * @ApiResource * @ApiFilter(SearchFilter::class, properties={ * "title": "partial", * "editor.name": "exact" * }) * @ORMEntity */ class Book
  • 13. Paramétrage - filtres de recherche Search Filter ?property=value exact - partial - start - end - word_start Numeric Filter Boolean Filter Range Filter Exists Filter Order Filter Custom Filter Date Filter ?property[<after|before|strictly_after|strictly_before>]=value
  • 14. Paramétrage - Opérations /** * @ApiResource( * collectionOperations={"get"}, * itemOperations={"get"} * ) * @ORMEntity */ class Book
  • 15. Paramétrage - Sous ressources /** * @ApiResource * @ORMEntity */ class Editor { [...] /** * @ORMOneToMany(targetEntity="Book", mappedBy="editor") * @ApiSubresource */ private $books;
  • 16. Paramétrage Sérialization /** * @ApiResource( * normalizationContext={"groups"={"book_read"}}, * denormalizationContext={"groups"={"book_write"}} * ) * @ORMEntity */ class Book { /** * @Groups({"book_read"}) */ private $id; /** * @Groups({"book_read", "book_write"}) */ private $title; /** * @Groups({"book_read", "book_write"}) */ private $editor;
  • 17. Paramétrage - Sérialization, lecture normalizationContext={"groups"={"book_read"}} { "id": 1, "title": "Da Vinci Code", "editor": "/api/editors/1" } normalizationContext={"groups"={"book_read", "editor_read"}} { "id": 1, "title": "Da Vinci Code", "editor": { "id": 1, "name": "Gallimard" } }
  • 18. Paramétrage - format de communication
  • 20.
  • 22. Filtres par défaut Pagination des listes Format custom FOS User Bundle integration Authentification JWT Gestion des rôles Pour aller plus loin FetchEager Behat et Behatch Documentation Swagger / Nelmio GraphQL support Schema.org Back Office en React
  • 23. Conclusion + Rapide et facile à mettre en place Souple et paramétrable Communauté active Préconisé par SensioLabs - Quelques bugs Doc relativement peu à jour
  • 24.
  • 25. Guilhem Bourgoin Développeur Symfony Freelance Merci :) A vos questions !
  • 27.
  • 28. JSON for Linked Data => Développé par Google. => Recommandé par le W3C depuis 2014. => JSON Standard avec des clés spéciales pour décrire le contexte => Compatible avec les technologies existantes JSON-LD { "@context": "/api/contexts/Book", "@id": "/api/books/1", "@type": "Book", "id": 1, "title": "Da Vinci Code", "editor": "/api/editors/1" }