Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
et Symfony API
Birane Baila Wane
A) Section 1 :Notion Api Rest et Api RestFull
https://geo.api.gouv.fr/
Response HTTP
Codes Statut de la Réponse
Level 1
Level 1
Level 2
Level 3
Section 2: Manipulation d’un Api Existence
1) Schéma de principe de passage entre format Object et Json
2) Consommer une API externe
3) Créer une API
4) Insérer des Données par Fixtures
5) Insérer les données à partir du Bundle Easy Admin
6) Gestion Référence circulaire
7) Gestion des Objets Imbriqués
Diagramme de Classe
1) Schéma de principe de passage entre format Object et Json
Consommer une API externe
Utilisation de l’api:
https://geo.api.gouv.fr/
1) Creer un projet Symfony Api
Methode 2:
$regionObject = $serializer->deserialize($regionJson,'App\Entity\Region[]','json');
/*foreach($regionObject as $region){
$entityManager->persist($region);
}
$entityManager->flush();
*/
/**
* @Route("/api/regions", name="api_all_region",methods={"GET"})
*/
public function showRegion(SerializerInterface $serializer,RegionRepository $repo)
{
$regionsObject=$repo->findAll();
$regionsJson =$serializer->serialize($regionsObject,"json");
return new JsonResponse($regionsJson,Response::HTTP_OK,[],true);
}
Application 3:Ajouter une Région et validation des Données à partir de Postman
1) Composant Pour la Validation
composer require symfony/validator
2) Code
/**
* @Route("/api/regions", name="api_add_region",methods={"POST"})
*/
public function addRegion(Request $request,ValidatorInterface $validator,SerializerInterface $serializer)
{
$region = $serializer->deserialize($request->getContent(), Region::class,'json');
$errors = $validator->validate($region);
if (count($errors) > 0) {
$errorsString =$serializer->serialize($errors,"json");
return new JsonResponse( $errorsString ,Response::HTTP_BAD_REQUEST,[],true);
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($region);
$entityManager->flush();
return new JsonResponse("succes",Response::HTTP_CREATED,[],true);
}
Validation dans l’entité Région
Regle de Validations
use Symfony\Component\Validator\Constraints as Assert;
* @UniqueEntity(
* fields={"code"},
* message="Le code doit être unique"
* )
b) Le Nom est obligatoire
1) Composants:
a) composer require --dev orm-fixtures
b) composer require fzaninotto/faker
Constructeur
private $repo;
public function __construct(RegionRepository $repo){
$this->repo=$repo;
}
Code Fixtures: Ajouter les données de Départements et de Commune
public function load(ObjectManager $manager)
{
$regions=$this->repo->findAll();
$faker = Factory::create('fr_FR');
//Insertion des Regions
foreach($regions as $region){
$departement=new Departement();
$departement->setCode($faker->postcode)
->setNom($faker->city)
->setRegion($region);
$manager->persist( $departement);
//Pour chaque Département, on insére 10 Communes
for ($i=0; $i <10 ; $i++) {
$commune=new Commune();
$commune->setCode($faker->postcode)
->setNom($faker->city)
->setDepartement($departement);
$manager->persist($commune);
}
}
$manager->flush();
}
Gestion Référence circulaire
Composant
/**
* @Route("/api/regions", name="api_all_region",methods={"GET"})
*/
public function showRegion(SerializerInterface $serializer,RegionRepository $repo)
{
$regionsObject=$repo->find(1);
$regionsJson =$serializer->serialize(
$regionsObject,
"json",
[
"groups"=>["listeRegionFull"]
]
);
}
Référence circulaire: Dans l’entité
class Region
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups({"listeRegionSimple","listeRegionFull"})
*/
private $id;
/**
* @ORM\OneToMany(targetEntity=Departement::class, mappedBy="region")
* @Groups({"listeRegionFull"})
*/
Gestion des Objets Imbriqués:Ajout d’un Département
//Entité Departement
/**
* @ORM\Entity(repositoryClass=DepartementRepository::class)
*/
class Departement
{
/**
* @ORM\OneToMany(targetEntity=Commune::class, mappedBy="departement",cascade={"persist"})
* @Groups({"listeRegionFull"})
*/
private $communes;
}
Gestion des Objets Imbriqués:Ajout d’un Département
//Controllers
public function addDepartement(Request $request,ValidatorInterface $validator,
SerializerInterface $serializer,RegionRepository $repo)
{
//Recuperation du Contenu Json
$departementJson = $request->getContent();
//Transformation du contenu en Tableau
$departementTable=$serializer->decode($departementJson,"json" );
//Recuperation de l'objet Region
$region =$repo->find((int)$departementTable["region"]["id"]);
$departementsObject=$serializer->deserialize($request->getContent(), Departement::class,'json');
$departementsObject->setRegion($region);
$errors = $validator->validate($departementsObject);
if (count($errors) > 0) {
$errorsString =$serializer->serialize($errors,"json");
return new JsonResponse( $errorsString ,Response::HTTP_BAD_REQUEST,[],true);
}
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($departementsObject);
$entityManager->flush();
return new JsonResponse("succes",Response::HTTP_CREATED,[],true);
}
Section 3 - Api Platform
6) Normalization et Dénormalisation
8) Controllers Personnalisés
Mise en place du Json Web Token (JWT)
Introduction
(Json Web Token) est un standard ouvert (RFC 7519) qui définit une manière
compacte et autonome de transmission sécurisée d’informations entre les parties
sous la forme d’un objet JSON.En d’autres termes, un jeton JWT est une chaîne
de caractères que l’on va envoyer à chaque requête que l’on souhaite effectuer
auprès d’une API afin de s’authentifier. Il contient toutes les informations
nécessaires à notre identification.
private $encoder;
public function __construct(RegionRepository $repo,UserPasswordEncoderInterface $encoder ){
$this->repo=$repo;
$this->encoder=$encoder;
Mise en place du Json Web Token (JWT)
Gestion des Fixtures Utilisateurs et Profils
$profils =["ADMIN" ,"FORMATEUR" ,"APPRENANT" ,"CM"];
}
$manager ->flush();
}
Mise en place du Json Web Token (JWT)
Installation du bundle
mkdir -p config/jwt
openssl genpkey -out config/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096
openssl pkey -in config/jwt/private.pem -out config/jwt/public.pem -pubout
Mise en place du Json Web Token (JWT)
Configuration de la route
/config/routes.yaml
api_login_check:
path: /api/login_check
Paramètrage du security.yaml
security :
encoders :
App\Entity\User :
algorithm : auto
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers :
# used to reload user from session & other features (e.g. switch_user)
app_user_provider :
entity :
class: App\Entity\User
property : login
# used to reload user from session & other features (e.g. switch_user)
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
api:
pattern: ^/api
stateless: true
anonymous: true
json_login:
username_path: login
check_path: /api/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
Exemple:
Request: http://localhost:8000/api/profils
Response:
{
"@id": "/api/profils?id=21",
"@type": "Profil",
"id": 21,
"libelle": "ADMIN",
"users": [
"/api/users/1",
"/api/users/2",
"/api/users/3"
]
}
CollectionOperations et ItemOperations
1) CollectionOperations
Exemple 1
* collectionOperations={
* "get","post"
* },
Exemple 2:
collectionOperations={
* "get_role_admin"={
* "method"="GET",
* "path"="/admin/profils" ,
* }
* }
ItemOperations
Exemple 1:
* itemOperations={
* "get","put"
* }
ItemOperations
Exemple 2:
itemOperations={
* "get_role_admin"={
* "method"="GET",
* "path"="/admin/profils/{id}" ,
* }
* }
Normalization et Dénormalisation
//Entity
* @ApiResource(
* normalizationContext={"groups"={"profil:read","profil:read_all"}}
* )
//Attribut
@Groups({"profil:read_all"})
Normalization et Dénormalisation
* collectionOperations={
* "get_simple"={
* "method"="GET",
* "path"="/admin/profils" ,
* "normalization_context"={"groups":"profil:read"}
* },
* "get_all"={
* "method"="GET",
* "path"="/admin/profils/all" ,
* "normalization_context"={"groups":"profil:read_all"}
* }
* }
Dénormalisation
Lorsqu'on envoie des données au serveur : POST, PUT
//Entity
* @ApiResource(
* denormalizationContext={"groups"={"profil:write"}}
* )
//Attribut
@Groups({"profil:write"})
Autorisation sur un Entité
1) Toutes L’entité
* @ApiResource(
* attributes={
* "security"="is_granted('ROLE_ADMIN')",
* "security_message"="Vous n'avez pas access à cette Ressource"
* }
)
Autorisation sur un Entité
1) Sur une Route
collectionOperations={
* "get_role_admin"={
* "method"="GET",
* "path"="/admin/profils" ,
* "security"="is_granted('ROLE_ADMIN')",
* "security_message"="Vous n'avez pas access à cette Ressource"
* }
* }
Controllers Personnalisés
1)Controllers
/**
* @Route(
* name="apprenant_liste",
* path="api/apprenants",
* methods={"GET"},
* defaults={
* "_controller"="\app\ControllerApprenantController::getApprenant",
* "_api_resource_class"=User::class,
* "_api_collection_operation_name"="get_apprenants"
* }
* )
*/
1)Controllers
}
Controllers Personnalisés