GraphQL : une alternative puissante au REST
GraphQL permet aux clients de demander exactement les données dont ils ont besoin. Dans des projets comme ceux de Matalto et Manymore, cette flexibilité a permis de réduire considérablement le nombre de requêtes API.
Installation avec Symfony
composer require overblog/graphql-bundle
composer require overblog/graphiql-bundle --dev
Définir un schéma
# config/graphql/types/Product.types.yaml
Product:
type: object
config:
fields:
id:
type: "ID!"
name:
type: "String!"
price:
type: "Float!"
category:
type: "Category"
resolve: "@=resolver('product_category', [value])"
Resolver
class ProductResolver implements ResolverInterface
{
public function __construct(
private ProductRepository $repository,
) {}
public function resolve(Argument $args): array
{
if (isset($args['id'])) {
return $this->repository->find($args['id']);
}
return $this->repository->findAll();
}
}
class ProductCategoryResolver implements ResolverInterface
{
public function resolve(Product $product): Category
{
return $product->getCategory();
}
}
Requête GraphQL
query {
products(first: 10) {
id
name
price
category {
name
}
}
}
Avantages vs REST
- Pas de sur-fetching : le client choisit les champs
- Pas de sous-fetching : une seule requête pour des données liées
- Typage fort : schéma auto-documenté
- Évolution facile : ajout de champs sans casser les clients existants