API REST – Présentation des bundles
Afin de mettre en place un API REST dans votre application Symfony, plusieurs bundles peuvent être configurés afin de faciliter votre travail de développement. La recette proposée utilise les bundles suivants :
friendsofsymfony/rest-bundle
Le rest-bundle offre plusieurs outils afin de faciliter la création de votre API REST.
https://github.com/FriendsOfSymfony/FOSRestBundle
jms/serializer-bundle
Le bundle serializer-bundle permet au développeur la sérialisation d’objets. Il facilite la conversion d’une entité Doctrine vers un objet JSON ou XML. Ce bundle, relativement complet, permet de définir plusieurs règles de sérialisation. Il est donc possible d’identifier les attributs des objets qui doivent être sérialisés et envoyés aux clients et ceux qui doivent être protégés.
https://packagist.org/packages/jms/serializer-bundle
lexik/jwt-authentication-bundle
jwt-authentication-bundle offre la possibilité d’utiliser les JSON Web Tokens afin de protéger les ressources de votre API REST. Lorsque l’utilisateur s’authentifie correctement, un token lui sera retourné. Ce token sera ensuite transmis au serveur afin de permettre à l’utilisateur de lire ou d’écrire les ressources protégées.
https://github.com/lexik/LexikJWTAuthenticationBundle
nelmio/cors-bundle
Le cors-bundle permet de définir les règles CORS. Ce bundle permet de définir les domaines qui auront accès à votre API REST.
https://github.com/nelmio/NelmioCorsBundle
nelmio/api-doc-bundle
Finalement, le api-doc-bundle facilite la création d’une documentation pour votre API REST. Avec quelques annotations utiles, le bundle est en mesure de récupérer les routes de vos ressources, d’identifier les entrées et les sorties afin de générer une belle documentation HTML à la Swagger.
https://github.com/nelmio/NelmioApiDocBundle
Installation des bundles utiles pour votre API REST
La prochaine étape consiste à installer ces bundles dans votre application Symfony 2 ou Symfony 3. L’outil Composer permettra de télécharger facilement les dépendances.
1 2 3 4 5 |
$ composer require "nelmio/cors-bundle" $ composer require "lexik/jwt-authentication-bundle" $ composer require "jms/serializer-bundle" $ composer require "friendsofsymfony/rest-bundle" $ composer require "nelmio/api-doc-bundle" |
1 |
$ composer require "jms/serializer-bundle" && composer require "friendsofsymfony/rest-bundle" |
Configuration des bundles utiles pour votre API REST
Bien entendu, ces bundles doivent être configurés. Il faudra donc lire la documentation pour chaque bundle afin d’appliquer les modifications requises à votre fichier app/config/config.yml.
Voici quelques extraits de configuration :
FOS rest-bundle
Ici, il est possible de spécifier les formats supportés (JSON ou/et XML), la route de l’API REST ainsi que plusieurs autres options.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# FOS Rest fos_rest: format_listener: rules: - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: false } - { path: '^/', stop: true } # Available for version >= 1.5 view: view_response_listener: true formats: json: true xml: false mime_types: json: ['application/json'] routing_loader: default_format: json include_format: false serializer: serialize_null: true param_fetcher_listener: true body_listener: true access_denied_listener: json: true body_converter: enabled: true |
JMS Serializer
La configuration doit spécifier le dossier des méta-data.
1 2 3 4 5 6 |
# JMS Serializer jms_serializer: metadata: directories: - { path: '%kernel.root_dir%/Resources/FOSUserBundle/serializer', namespace_prefix: 'FOS\UserBundle' } |
Lexik JWT Authentication
Pour le bundle JWT Authentication, il faut spécifier le chemin des clés privé et public, le mot de passe pour ces clés et la durée de vie du jeton JWT produit.
1 2 3 4 5 6 |
# Lexik JWT Authentication lexik_jwt_authentication: private_key_path: %private_key_path% public_key_path: %public_key_path% pass_phrase: %pass_phrase% token_ttl: %token_ttl% |
Nelmio CORS
Pour Nelmio CORS, il est possible de spécifier les méthodes supportées par l’API REST ainsi que les domaines d’origines. Dans cet exemple, tous les domaines peuvent accéder à l’API REST.
1 2 3 4 5 6 7 |
nelmio_cors: paths: '^/api/': allow_origin: ['*'] allow_headers: ['*'] allow_methods: ['POST', 'PUT', 'GET', 'DELETE'] max_age: 3600 |
Nelmio API Doc
Pour le bundle API Doc, il est possible de spécifier le nom de la documentation et d’activer l’antémémoire.
1 2 3 4 5 |
nelmio_api_doc: name: REST API doc cache: enabled: false file: '%kernel.cache_dir%/api-doc.cache' |
Mise à jour du fichier AppKernel.php
Une fois les dépendances téléchargées, il faut demander à Symfony de les exécutés. Le fichier AppKernel.php contient la liste de tous les bundles à charger dans votre application. Certains bundles sont utiles pour la production et d’autres pour le développement.
Voici un exemple de fichier AppKernel.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class AppKernel extends Kernel { public function registerBundles() { $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new FOS\UserBundle\FOSUserBundle(), new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(), // FosRest + JWT experiment new JMS\SerializerBundle\JMSSerializerBundle(), new FOS\RestBundle\FOSRestBundle(), new Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle(), new Acme\Bundle\ApiBundle\AcmeApiBundle(), new Nelmio\CorsBundle\NelmioCorsBundle(), new Nelmio\ApiDocBundle\NelmioApiDocBundle(), ); if (in_array($this->getEnvironment(), array('node', 'dev', 'test'))) { $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); $bundles[] = new Liip\FunctionalTestBundle\LiipFunctionalTestBundle(); } return $bundles; } } |
Salut, J’ai créé une api qui fonctionne sans problème. J’ai décidé d’utiliser pour la premiere fois NelmioCorsBundle sur un projet Symfony 3 et rien ne semble être pris en compte puisque les call XHR retourne toujours l’erreur classique comme si rien n’était configuré. Est ce que quelqu’un a deja utilisé ce bundle avec SF3 ?
Bonjour et merci de participer au forum! J’utilise actuellement NelmioCorsBundle.
Est-ce possible de fournir le message d’erreur?
La configuration de base est présentée dans l’article.
En configurant l’attribut « paths », il est possible de définir quelles routes seront prises en charge par NelmioCorsBundle. Dans l’exemple les routes débutent par /api/
Il peut-être utile de vider la cache pour l’environnement dev: $ php bin/console cache:clear –env=dev
nelmio_cors:
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['*']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE']
max_age: 3600
Bonjour j’ai lu toutes les lignes de ce tuto et je pense que mon problème n’est pas répertorié…
Je suis à la recherche d’un bundle compatible avec symfony 3 qui permet d’attaquer une API REST externe (que j’ai développé en python et Django qui contient mes données)
Bonjour et merci pour votre participation au site. J’ai identifié un bundle Symfony qui pourrait vous service afin de créer un client d’une API REST. Ce client est basé sur Guzzle, un outil qui permet d’exécuter des requêtes HTTP de type GET, POST, PUT, DELETE, …
Il faut donc modifier le fichier composer.json et y inclure guzzle ainsi que guzzle-service
"require": {
// ...
"guzzlehttp/guzzle": "4.2.*@dev",
"guzzlehttp/guzzle-services": "0.3.*@dev"
}
Référence http://devblog.lexik.fr/symfony2/implementation-dun-client-restful-avec-une-description-guzzle-2756
Laissez-moi savoir si cela vous est utile.
Merci!