SlideShare une entreprise Scribd logo
Introduction
à
M. Abdoulaye DIENG Avril 2021
Objectif général
Prendre en main l’un des frameworks PHP
les plus utilisés
2
Objectifs opérationnels
• Faire correspondre une URL donnée à un traitement précis
grâce au routage
• Traiter les requêtes grâce aux contrôleurs
• Intégrer des données dans des templates grâce à TWIG
• Faciliter la communication avec une base de données grâce
à Doctrine
• Permettre à un utilisateur d’initialiser ou de modifier les
attributs d'un objet métier grâce aux formulaires
Sommaire
1) Préliminaires
2) Routage
3) Contrôleurs
4) Twig
5) BDD
6) Formulaires
4
Préliminaires
sommaire
1) Qu’est ce qu’un Framework ?
2) Qu’est ce que Symfony ?
3) Prérequis pour installer Symfony
4) Installation de Symfony sous Windows avec Composer
5) Installation de Symfony sous Mac et Linux avec Composer
6) Première page
5
Préliminaires
Qu’est ce qu’un Framework ?
• Problématiques
Comment développer efficacement (rapidité, bonnes
pratiques, …) une application ?
• Solution : ensemble de composants et de préconisations
« prêt à l’emploi » = Framework
• Avantages d’un Framework
 Structuration du code (modèle MVC)
 Abstraction de la base de données
 Réutilisation de composants éprouvés et approuvés
(Email, Users, …)
 Instauration de bonnes pratiques de codage
 Facilitation de la maintenance et de l’évolution du code
 Facilitation du travail en équipe
 Forte communauté (support et mises à jour) 6
Préliminaires
Qu’est ce que Symfony ?
• Symfony est un des Frameworks PHP les plus utilisés
• Edité en 2005 par la société française SensioLabs
• Dernière version stable (Novembre 2020) : 5.2.6
• Adopté par Dailymotion, OpenClassrooms, Drupal,
BlaBlaCar, …
• Concurrencé par Laravel, CodeIgniter, Zend Framework,
CakePHP, …
7
Préliminaires
prérequis pour installer Symfony
• Version de PHP ≥ 7.2.5
• Activer les extensions Ctype, iconv, JSON, PCRE, Session,
SImpleXML et Tokenizer
• Prérequis pour utiliser Doctrine :
 Activer PDO
 Installer le pilote PDO du serveur de bdd à utiliser.
 Pour ce cours, installer Symfony CLI
https://symfony.com/download
8
Préliminaires
Installation de Symfony sous Windows avec Composer
• S’assurer qu’un exécutable php est accessible globalement : chemin
d’accès présent dans le PATH
• Télécharger (https://getcomposer.org/Composer-Setup.exe) et
exécuter Composer-Setup.exe
• Pour ce cours, installer Symfony CLI
https://symfony.com/download
• Créer un nouveau projet Symfony
symfony new symfony-classroom
• Démarrer le projet avec les commandes :
cd symfony-classroom/ puis symfony serve
• Accéder à la page d’accueil de Symfony à l’adresse
http://localhost:8000/
9
Préliminaires
Installation de Symfony sous Mac et Linux
• S’assurer qu’un exécutable php est accessible globalement
• Télécharger la dernière version du composer.phar
https://getcomposer.org/download/
• Rendre globale puis exécutable la commande composer
cp chemin/vers/composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
• Pour ce cours, installer Symfony CLI
https://symfony.com/download
• Créer un nouveau projet Symfony
symfony new symfony-classroom
• Démarrer le projet avec les commandes :
cd symfony-classroom/ puis symfony serve
• Accéder à la page d’accueil de Symfony à l’adresse
http://localhost:8000/ 10
Préliminaires
première page
1) Installer le module « maker »
Cmd : composer require --dev symfony/maker-bundle
2) Installer le module « annotation »
Commande : composer require annotations
3) Créer le premier contrôleur
php bin/console make:controller FirstController
4) Après le démarrage du serveur, requêter
http://127.0.0.1:8000/first
11
Routage
sommaire
1) Présentation
2) Définition en annotation
3) Définition en YAML
4) Paramètres de route
5) Paramètres optionnels de route
6) Génération d’URL
12
Routage
présentation
• Pbl : comment accéder à notre application ?
• Sol : définir des routes
• Routage = faire correspondre une URL donnée à une page
précise.
• Intérêt : avoir de belles URL pour un bon référencement Web
et un confort des visiteurs
Ex : /read/intro-to-symfony au lieu de
index.php?article_id=57
• Définition d’une route = motif d’un path d’URL + action d’un
contrôleur 13
Routage
définition en annotation
• Emplacement
juste avant la définition d’une action d’un contrôleur
• Syntaxe
/**
* @Route("path d’URL", name="nomRoute")
*/
• Exemple
/**
* @Route("/first", name="first")
*/
14
Routage
définition en YAML
• Emplacement
dans un fichier de configuration route.yaml du dossier config
• Syntaxe (retrait = 4 espaces)
nomRoute:
path: path d’URL
controller: namespaceControllerNomController::nomAction
• Exemple
first:
path: first
defaults: AppControllerFirstController::first
15
Routage
paramètre de route
• Pb : peut-on se servir du chemin pour envoyer des données
• Sol : un segment variable du chemin
• Paramètre de route = portion variable du path
• Exemple : id d’une données à traiter
• Syntaxes d’ajout du paramètre
1) Suffixer {nomParametre} au path
2) Passer $nomParametre en paramètre à l’action du
contrôleur
16
Routage
paramètre de route - exemple
• Dans FirstController.php, définissez cette route accompagnée
de son action
17
• Requêtez les chemins
/hello/votrePrenom
/hello // transition
Routage
paramètre optionnel de route
Syntaxes d’ajout du paramètre optionnel
1) Suffixer {nomParametre} au path
2) Passer $nomParametre = valeurParDefaut en
paramètre à l’action du contrôleur
18
Routage
paramètre optionnel de route - exemple
• Initialisez à "world" le paramètre de l’action hello()
• Requêtez les chemins
 /hello/VotrePrenom
 /hello
19
Routage
génération d’URL
• La génération d’URL permet
 d’éviter d’écrire manuellement les valeurs des href dans les
templates
 lorsqu’une URL a changé, de modifier juste la définition de
la route
• Méthode generateURL() du contrôleur qui reçoit en
paramètre le nom de la route
• La méthode peut même recevoir éventuellement, en second
paramètre, un tableau contenant le paramètre à passer à l’URL
20
Routage
génération d’URL - exemple
1) À l’action index()
• commentez l’instruction return ;
• ajoutez les instructions suivantes :
$url = $this->generateUrl('hello', ["prenom"=>"Redirected User"]);
return $this->redirect($url);
2) Testez le chemin /first
21
Contrôleurs
sommaire
1) Présentation
2) Réception du contenu
a) Via GET
b) Via POST
3) Réponse
a) Retourner du texte
b) Retourner un template
22
Contrôleurs
présentation
• Contrôleur : classe qui regroupe des actions connexes
• Action : fonction ou méthode qui reçoit une requête, la traite
et retourne une réponse (texte, HTML, XML, JSON, image,
redirection, erreur 404, …)
• Pour simplifier certain traitement, le contrôleur peut hériter
de la classe AbstractController
• Exemple : FirstController
23
Contrôleurs
réception de contenu via GET
• GET : méthode HTTP d’envoi qui annexe toute donnée à l’URL
• Importer la classe Request
use SymfonyComponentHttpFoundationRequest;
• Passer en paramètre une instance de Request à l’action qui
doit recevoir le contenu via GET
• Syntaxe de réception
$request->query->get("nomDuContenu")
24
Contrôleurs
réception de contenu via GET - exemple
• Ajouter à FirstController.php
use SymfonyComponentHttpFoundationRequest;
• Ajouter à hello() le code en rouge
public function hello($prenom, Request $request) {
$nom = $request->query->get("nom");
return $this->json(['message' => "Hello $prenom $nom !",]);
}
• Requêter
http://localhost:8000/hello/Yero?nom=Sow
25
Contrôleurs
réception de contenu via POST
• POST : méthode HTTP d’envoi qui incorpore toute donnée
dans la requête HTTP
• Importer la classe Request
use SymfonyComponentHttpFoundationRequest;
• Passer en paramètre un objet Request à l’action qui doit
recevoir le contenu via POST
• Syntaxe de réception
$request->request->get("nomDuContenu")
26
Contrôleurs
réception de contenu via POST - exemple
• Ajouter à hello() le code en rouge
$age = $request->request->get("age");
return $this->json([
'message' => "Hello $prenom $nom ! Are you $age old ?",
]);
• Avec un client REST (ARC ou Postman), faire une requête telle
que :
 Méthod = POST
 URL = http://localhost:8000/hello/Yero?nom=Sow
 Paramètre de formulaire : age=32
27
Contrôleurs
retourner du texte
• Importer la classe Response
use SymfonyComponentHttpFoundationResponse;
• Retourner une instance de Response initialisée avec le texte
à retourner
return new Response(chaineDeCaracteres);
28
Contrôleurs
retourner du texte - exemple
• Si ce ne pas encore fait, ajouter à FirstController.php
use SymfonyComponentHttpFoundationResponse;
• Dans hello() commenter les lignes commençant par $age et
par return, puis ajouter la ligne suivante
return new Response("Bonjour $prenom $nom");
• Requêter
http://localhost:8000/hello/Yero?nom=Sow
29
Contrôleurs
retourner un template
• Utilisez la méthode render() qui rend un template (à voir) et
place ce contenu dans un objet Response
• Syntaxe
return $this->render('first/index.html.twig', [
'controller_name' => 'FirstController',
]);
30
Moteur de template Twig
sommaire
1) Présentation
2) Installation et emplacement
3) Nommage
4) Expressions
5) Filtres
6) Structures conditionnelles
7) Structures itératives
8) Inclusion d’un template
9) Héritage d’un template
31
Moteur de template Twig
présentation
• Un système de templates gère la disposition générale des
éléments de l’interface ainsi que l’aspect visuel de cette
interface
• Moteur de template = programme qui permet d’intégrer des
données dynamiques dans un template
• Qlq intérêts
 Séparation du traitement et de la présentation
PHP ne « sais pas » comment les données seront affichées
TWIG ne « sais pas » comment les données sont obtenues
 Facilitation du travail en équipe car plus accessible pour les
web designers
 Rapidité : utilisation d’un cache
 Sécurisation des variables
32
Moteur de template Twig
installation, emplacement et nommage
• Installation TWIG
commande : composer require twig
• Emplacement des templates
dossier « template » créé automatiquement par l’installation
de Twig
• Nommage
nom des fichiers et des dossiers en snake case
33
Moteur de template Twig
expressions
• Syntaxe d’affichage d’une expression
{{ expression }}
• Exemples
 Variable simple : {{ age }}
 Élément d’un tableau ou champ d’un objet :
{{ user.prenom }}
34
Moteur de template Twig
filtres
• Filtre : outil de formatage d’une donnée
• Syntaxes d’utilisation
 {{ var | filtre }}
 {{ var | filtre1 | filtre2 }}
 {{ var | filtre(arg) }}
 {% filter filtre %} contenu assez consistant à filtrer {% endfilter
%}
• Quelques filtres
 lower / upper / capitalize
 date(format,timezone),
 join(sep)
 number_format(nbr_dec,dec_pt,th_sep)
 replace(search,replace)
+ d’infos : https://twig.symfony.com/doc/3.x/filters/index.html
35
Moteur de template Twig
structures conditionnelles
• {% if bool_expr %}
contenu
{% endif %}
• {% if bool_expr %}
contenu
{% else %}
contenu alternatif
{% endif %}
• {% if bool_expr1 %}
contenu
{% elseif bool_expr2 %}
contenu alternatif
{% else %}
autre contenu
alternatif
{% endif %} 36
Moteur de template Twig
structures itératives
• {% for donnée in ensDeDonnées %}
traitement donnée courante
{% endfor %}
• {% for clé,donnée in ensDeDonnées %}
traitement clé et donnée courantes
{% endfor %}
• {% for donnée in ensDeDonnées if bool_expr
%}
traitement donnée courante
{% endfor %}
• {% for donnée in ensDeDonnées %}
traitement donnée courante
{% else %}
traitement ensDeDonnées vide
{% endfor %} 37
Moteur de template Twig
exemple sur les structures de contrôle
1) Ajoutez à FirstController
38
2) Dans templates/first/, éditez notes.html.twig
Requêtez le chemin « /notes »
Moteur de template Twig
inclusion d’un template
• Syntaxe d’inclusion d’un template dans un autre
{{ include("chemin/vers/template/à/inclure" }}
• Le template inclus a accès à toute variable du template
enveloppant.
39
Moteur de template Twig
héritage d’un template
• Template de base
 contient les éléments communs de l’interface
 définit des « blocks » à remplir ou à compléter par des
templates enfants
{% block nomDuBlock %} … {% endblock %}
 Les « blocks » peuvent être imbriqués
• Template enfant
 doit d’abord étendre le template de base
{% extends 'chemin/vers/template/de/base' %}
 redéfinit tout « block » qu’il souhaite remplir en
oécrasant son contenu de base
o rajoutant du contenu avec {{ parent() }}
 conserve le contenu de base de tout « block » non redéfini
40
Moteur de template Twig
exemple template parent
Éditez templates/layout.html.twig
41
Moteur de template Twig
exemple template enfant
Éditez templates/first/notes.html.twig
42
Requêtez le chemin « /notes »
BDD
sommaire
1) Présentation et installation de Doctrine
2) Configurer et créer la base de données
3) Générer une entité
4) Créer la table correspondant à une entité avec les migrations
5) Modifier une entité
6) Persister un nouvel objet
7) Récupérer des objets
8) Modifier un objet
9) Supprimer un objet
43
BDD
présentation et installation
• Doctrine = ORM (Object-Relation Mapper) permettant de
faciliter la communication avec une base de données
• Entité = classe qui fait correspondre un objet PHP à une table
• Objet de l’entité  enregistrement de la table
• Commande d’installation de Doctrine
composer require symfony/orm-pack
44
Table
apprenants
id prenom age
1 Ali 23
Classe
Apprenant
id
prenom
age
Objet
Apprenant
id : 1
prenom : Ali
age : 23
O
R
M
BDD
configurer et créer la base de données
• Configurer la bdd
 Dans la variable d'environnement DATABASE_URL du fichier
.env :
DATABASE_URL="mysql://db_user:db_password@127.0.
0.1:3306/db_name?serverVersion=5.7"
 Exemple
DATABASE_URL="mysql://root:@127.0.0.1:3306/symfony
-classroom"
• Créer la bdd avec la commande (le serveur de bdd doit être actif)
php bin/console doctrine:database:create
BDD
générer une entité
• Générer une entité
 Commande : php bin/console make:entity
script interactif qui demande le nom de l’entité ainsi que les
caractéristiques de chacun de ses attributs (id, clé primaire et
auto-incrémenté, est créé automatiquement)
 Résultat
oClasse :
src/Entity/Nom_entité.php
o Repository :
src/Repository/Nom_entitéRepository.php
où les requêtes principales seront codées.
• Exemple
Créer l’entité Apprenant avec les attributs prenom et age.
L’id, clé primaire et auto-incrémenté, sera créé automatiquement
46
BDD
migration
• Une migration permet de créer, de mettre à jour et de suivre
les évolutions d’un schéma de base de données.
• Commande pour créer une migration
php bin/console make:migration
• La migration (au format VersionDateTime.php) sera créée
dans le dossier migrations et contiendra deux méthodes
 up() : exécutée lorsque la migration est lancée
 down() : exécutée lorsque la migration est annulée
• Commande pour lancer les migrations
php bin/console doctrine:migrations:migrate
• Exemple
1) Créez une migration
2) Lancez les migrations pour que la table apprenants soit
créée 47
BDD
persister un nouvel objet
• Dans une action d’un contrôleur
1) Créer un objet de l’entité puis renseigner ses attributs
NB : importer la classe de l’entité
use AppEntityNom_entité
2) Récupérer le service EntityManager
$em = $this->getDoctrine()->getManager();
3) Signaler le souhait de persister l’objet (aucune requête
SQL ne sera exécutée à ce stade)
$em->persist(nomObjet);
4) Demander l’exécution de la requête d’insertion
$em->flush();
• L’objet inséré reçoit un id récupérable par $nomObjet->getId()
• Les transactions expliquent $em->persist() et $em->flush()
48
BDD
persister un nouvel objet - exemple
49
Testez avec un client REST
Dans FirstController, ajoutez
use AppEntityApprenant; et l’action suivante :
BDD
récupérer des objets
• Dans une action d’un contrôleur
1) récupérer le repository de l'entité
$repo = $this->getDoctrine()->getRepository(NomEntité::class)
2) Récupérer l’entité avec la methode find() du repository
$nomObjet = $repo->find($id);
• Autres méthodes du repository
 findOneBy(['nomAttribut1' => Valeur, 'nomAttribut2' => Valeur, …])
trouver un objet à partir d’un ou de +sieurs de ses attributs
 findBy(['nomAttribut1' => Valeur], ['nomAttribut2' => Valeur], …)
trouver +sieurs objets à partir d’un ou de +sieurs d’attributs
 findAll() trouver tous les objets
50
BDD
récupérer un objet - exemple
51
Testez les chemins « apprenants/1 » et « apprenants/0 »
BDD
modifier un objet
Dans une action d’un contrôleur
1) Récupérez le service EntityManager
$em = $this->getDoctrine()->getManager();
2) Récupérez l’objet avec la methode find() du repository
$nomObjet = $em->getRepository(NomEntité::class)-
>find($id)
3) Modifier l’objet
4) Invoquez la méthode flush() de l’EntityManager
52
BDD
modifier un objet - exemple
53
Requêtez « apprenants/1 » avec comme méthode PUT
BDD
supprimer un objet
Dans une action d’un contrôleur
1) Récupérez le service EntityManager
$em = $this->getDoctrine()->getManager();
2) Récupérez l’objet avec la methode find() du repository
$nomObjet = $em->getRepository(NomEntité::class)->find($id);
3) Invoquez la méthode remove() de l’EntityManager
$em->remove($nomObjet);
4) Invoquez la méthode flush() de l’EntityManager
54
Formulaires
sommaire
1) Présentation
2) Construction
3) Affichage
4) Gestion de la soumission
55
Formulaires
présentation et installation
• Formulaire = interface entre l’utilisateur et l’application
• Principal objectif : permettre à un utilisateur d’initialiser ou de
modifier les attributs d'un objet métier (ex : apprenant)
• Commande pour installer les fonctionnalités des formulaires
composer require symfony/form
56
Formulaires
construction
Dans une action d’un contrôleur
1) Créer un objet métier
NB : sa classe est à importer
2) Créer un objet formBuilder avec le constructeur
createFormBuilder() recevant en paramètre l’objet métier
3) Ajouter un (ou +sieurs) champ(s) au formulaire à construire
avec la méthode add() du formBuilder. add() reçoit
a) le nom d’un attribut de l’objet métier
ou bien 'save' (bouton de soumission)
b) le nom de la classe du type de cet attribut
NB : la classe est à importer
4) Récupérer le formulaire créé avec getForm() du formBuilder
5) Permettre l’affichage du formulaire dans une vue avec
createView() du formulaire
57
Formulaires
construction - exemple
58
Formulaires
affichage
• Afficher le formulaire avec l’une des méthodes
(form en paramètre est une variable transmise par le contrôleur )
1) {{ form(form) }}
2) {{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
• Personnaliser un label
1) {{ form_label(form.NomAttribut, 'Label personnalisé') }}
2) {{ form_widget(form.NomAttribut) }}
pour afficher le champ associé au label
59
Formulaires
affichage - exemple
60
Requêtez « apprenants » avec un navigateur
Formulaires
gestion de la soumission
Dans l’action où a été construite le formulaire, juste après avoir
récupéré l’objet formulaire
1) Récupérer les données soumises et hydrater l’objet métier grâce
à la méthode handleRequest() de l’objet formulaire
2) Vérifier la validité des données soumises avec la méthode
isValid() de l’objet formulaire avant de traiter (sauvegarder en
base de données, intégrer dans une réponse, …) l’objet métier
61
Formulaires
gestion de la soumission - exemple
62
Requêtez « apprenants » avec un navigateur
Références
• https://symfony.com/doc/5.2/setup.html
• https://symfony.com/doc/5.2/page_creation.html
• https://symfony.com/doc/5.2/routing.html
• https://symfony.com/doc/5.2/controller.html
• https://symfony.com/doc/5.2/templates.html
• https://symfony.com/doc/5.2/doctrine.html
• https://symfony.com/doc/5.2/forms.html
63

Contenu connexe

PPTX
Introduction à Symfony
PPTX
Introduction à React
PDF
Cours HBase et Base de Données Orientées Colonnes (HBase, Column Oriented Dat...
PDF
A la découverte de vue.js
PDF
Introduction à React
PPTX
Les collections en Java
PPTX
Express JS
PDF
Android-Tp4: stockage
Introduction à Symfony
Introduction à React
Cours HBase et Base de Données Orientées Colonnes (HBase, Column Oriented Dat...
A la découverte de vue.js
Introduction à React
Les collections en Java
Express JS
Android-Tp4: stockage

Tendances (20)

PDF
Support programmation orientée objet c# .net version f8
PDF
Cours JavaScript
PPT
Presentation Symfony
PPTX
Introduction à spring boot
PDF
Cours php -partie 1.pdf
PDF
Support developpement applications mobiles avec ionic v3 et v4
PPTX
JNDI Java Naming Derectory Interfaces
PPTX
Introduction au Framework Laravel
PDF
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
PDF
Chapitre 11: Expression Lambda et Référence de méthode en Java
PPTX
Angular
PDF
introduction to Vue.js 3
PDF
Chapitre 5 classes abstraites et interfaces
PPT
PDF
PDF
Cours design pattern m youssfi partie 6 proxy
PPTX
Initiation à Express js
PDF
Support NodeJS avec TypeScript Express MongoDB
PDF
résumé POO java .pdf
PDF
React-cours.pdf
Support programmation orientée objet c# .net version f8
Cours JavaScript
Presentation Symfony
Introduction à spring boot
Cours php -partie 1.pdf
Support developpement applications mobiles avec ionic v3 et v4
JNDI Java Naming Derectory Interfaces
Introduction au Framework Laravel
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Chapitre 11: Expression Lambda et Référence de méthode en Java
Angular
introduction to Vue.js 3
Chapitre 5 classes abstraites et interfaces
Cours design pattern m youssfi partie 6 proxy
Initiation à Express js
Support NodeJS avec TypeScript Express MongoDB
résumé POO java .pdf
React-cours.pdf
Publicité

Similaire à Introduction à Symfony (20)

PPTX
Introduction à Laravel
PDF
cours-laravel-lpti-dar324-janTEDTF-24.pdf
PDF
cours.symfony.web2pouringenieurseninformatique
PDF
spring.pdf
PPTX
ch3 - Laravel - Les bases de la pres.pptx
ODP
Formation PHP avancé - Cake PHP
PPTX
php2 : formulaire-session-PDO
PPT
Soutenance Zend Framework vs Symfony
PPTX
Drupal 8, symfony
PPTX
Symfony3 overview
PDF
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
PDF
Service WEB de type REST avec Java
PPTX
Introduction à AngularJS
PDF
Introduction à Symfony2
PDF
spring-boot-fr.pdf
PDF
Atelier symfony n 3
PPTX
SOLID : les principes à l’origine du succès de Symfony et de vos applications
PDF
6. Approche Agile_tests unitaires et couverture de code.pdf
PDF
Mieux Développer en PHP avec Symfony
PDF
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Introduction à Laravel
cours-laravel-lpti-dar324-janTEDTF-24.pdf
cours.symfony.web2pouringenieurseninformatique
spring.pdf
ch3 - Laravel - Les bases de la pres.pptx
Formation PHP avancé - Cake PHP
php2 : formulaire-session-PDO
Soutenance Zend Framework vs Symfony
Drupal 8, symfony
Symfony3 overview
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
Service WEB de type REST avec Java
Introduction à AngularJS
Introduction à Symfony2
spring-boot-fr.pdf
Atelier symfony n 3
SOLID : les principes à l’origine du succès de Symfony et de vos applications
6. Approche Agile_tests unitaires et couverture de code.pdf
Mieux Développer en PHP avec Symfony
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Publicité

Plus de Abdoulaye Dieng (20)

PPTX
Fondamentaux du Référencement naturel
PPTX
Panorama des Technologies mobiles
PPTX
Prise en main de WordPress
PPTX
Initiation à Bootstrap
PPTX
Fondamentaux d’une API REST
PPTX
Introduction à Angular
PPTX
Introduction à JavaScript
PPTX
Introduction à l’orienté objet en Python
PPTX
Introduction à Python
PPTX
Introduction à React JS
PPTX
Initiation à l'algorithmique
PPTX
Initiation à Bootstrap
PPTX
Requêtes HTTP synchrones et asynchrones
PPTX
Introduction à jQuery
PPT
Introduction à JavaScript
PPTX
Initiation à l'algorithmique
PPTX
Introduction à HTML 5
PPTX
introduction à MongoDB
PPTX
Cours référencement naturel supdeco techonologie avril-15
PPTX
Cours CSS feuilles de style en cascade- mars 2015
Fondamentaux du Référencement naturel
Panorama des Technologies mobiles
Prise en main de WordPress
Initiation à Bootstrap
Fondamentaux d’une API REST
Introduction à Angular
Introduction à JavaScript
Introduction à l’orienté objet en Python
Introduction à Python
Introduction à React JS
Initiation à l'algorithmique
Initiation à Bootstrap
Requêtes HTTP synchrones et asynchrones
Introduction à jQuery
Introduction à JavaScript
Initiation à l'algorithmique
Introduction à HTML 5
introduction à MongoDB
Cours référencement naturel supdeco techonologie avril-15
Cours CSS feuilles de style en cascade- mars 2015

Introduction à Symfony

  • 2. Objectif général Prendre en main l’un des frameworks PHP les plus utilisés 2
  • 3. Objectifs opérationnels • Faire correspondre une URL donnée à un traitement précis grâce au routage • Traiter les requêtes grâce aux contrôleurs • Intégrer des données dans des templates grâce à TWIG • Faciliter la communication avec une base de données grâce à Doctrine • Permettre à un utilisateur d’initialiser ou de modifier les attributs d'un objet métier grâce aux formulaires
  • 4. Sommaire 1) Préliminaires 2) Routage 3) Contrôleurs 4) Twig 5) BDD 6) Formulaires 4
  • 5. Préliminaires sommaire 1) Qu’est ce qu’un Framework ? 2) Qu’est ce que Symfony ? 3) Prérequis pour installer Symfony 4) Installation de Symfony sous Windows avec Composer 5) Installation de Symfony sous Mac et Linux avec Composer 6) Première page 5
  • 6. Préliminaires Qu’est ce qu’un Framework ? • Problématiques Comment développer efficacement (rapidité, bonnes pratiques, …) une application ? • Solution : ensemble de composants et de préconisations « prêt à l’emploi » = Framework • Avantages d’un Framework  Structuration du code (modèle MVC)  Abstraction de la base de données  Réutilisation de composants éprouvés et approuvés (Email, Users, …)  Instauration de bonnes pratiques de codage  Facilitation de la maintenance et de l’évolution du code  Facilitation du travail en équipe  Forte communauté (support et mises à jour) 6
  • 7. Préliminaires Qu’est ce que Symfony ? • Symfony est un des Frameworks PHP les plus utilisés • Edité en 2005 par la société française SensioLabs • Dernière version stable (Novembre 2020) : 5.2.6 • Adopté par Dailymotion, OpenClassrooms, Drupal, BlaBlaCar, … • Concurrencé par Laravel, CodeIgniter, Zend Framework, CakePHP, … 7
  • 8. Préliminaires prérequis pour installer Symfony • Version de PHP ≥ 7.2.5 • Activer les extensions Ctype, iconv, JSON, PCRE, Session, SImpleXML et Tokenizer • Prérequis pour utiliser Doctrine :  Activer PDO  Installer le pilote PDO du serveur de bdd à utiliser.  Pour ce cours, installer Symfony CLI https://symfony.com/download 8
  • 9. Préliminaires Installation de Symfony sous Windows avec Composer • S’assurer qu’un exécutable php est accessible globalement : chemin d’accès présent dans le PATH • Télécharger (https://getcomposer.org/Composer-Setup.exe) et exécuter Composer-Setup.exe • Pour ce cours, installer Symfony CLI https://symfony.com/download • Créer un nouveau projet Symfony symfony new symfony-classroom • Démarrer le projet avec les commandes : cd symfony-classroom/ puis symfony serve • Accéder à la page d’accueil de Symfony à l’adresse http://localhost:8000/ 9
  • 10. Préliminaires Installation de Symfony sous Mac et Linux • S’assurer qu’un exécutable php est accessible globalement • Télécharger la dernière version du composer.phar https://getcomposer.org/download/ • Rendre globale puis exécutable la commande composer cp chemin/vers/composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer • Pour ce cours, installer Symfony CLI https://symfony.com/download • Créer un nouveau projet Symfony symfony new symfony-classroom • Démarrer le projet avec les commandes : cd symfony-classroom/ puis symfony serve • Accéder à la page d’accueil de Symfony à l’adresse http://localhost:8000/ 10
  • 11. Préliminaires première page 1) Installer le module « maker » Cmd : composer require --dev symfony/maker-bundle 2) Installer le module « annotation » Commande : composer require annotations 3) Créer le premier contrôleur php bin/console make:controller FirstController 4) Après le démarrage du serveur, requêter http://127.0.0.1:8000/first 11
  • 12. Routage sommaire 1) Présentation 2) Définition en annotation 3) Définition en YAML 4) Paramètres de route 5) Paramètres optionnels de route 6) Génération d’URL 12
  • 13. Routage présentation • Pbl : comment accéder à notre application ? • Sol : définir des routes • Routage = faire correspondre une URL donnée à une page précise. • Intérêt : avoir de belles URL pour un bon référencement Web et un confort des visiteurs Ex : /read/intro-to-symfony au lieu de index.php?article_id=57 • Définition d’une route = motif d’un path d’URL + action d’un contrôleur 13
  • 14. Routage définition en annotation • Emplacement juste avant la définition d’une action d’un contrôleur • Syntaxe /** * @Route("path d’URL", name="nomRoute") */ • Exemple /** * @Route("/first", name="first") */ 14
  • 15. Routage définition en YAML • Emplacement dans un fichier de configuration route.yaml du dossier config • Syntaxe (retrait = 4 espaces) nomRoute: path: path d’URL controller: namespaceControllerNomController::nomAction • Exemple first: path: first defaults: AppControllerFirstController::first 15
  • 16. Routage paramètre de route • Pb : peut-on se servir du chemin pour envoyer des données • Sol : un segment variable du chemin • Paramètre de route = portion variable du path • Exemple : id d’une données à traiter • Syntaxes d’ajout du paramètre 1) Suffixer {nomParametre} au path 2) Passer $nomParametre en paramètre à l’action du contrôleur 16
  • 17. Routage paramètre de route - exemple • Dans FirstController.php, définissez cette route accompagnée de son action 17 • Requêtez les chemins /hello/votrePrenom /hello // transition
  • 18. Routage paramètre optionnel de route Syntaxes d’ajout du paramètre optionnel 1) Suffixer {nomParametre} au path 2) Passer $nomParametre = valeurParDefaut en paramètre à l’action du contrôleur 18
  • 19. Routage paramètre optionnel de route - exemple • Initialisez à "world" le paramètre de l’action hello() • Requêtez les chemins  /hello/VotrePrenom  /hello 19
  • 20. Routage génération d’URL • La génération d’URL permet  d’éviter d’écrire manuellement les valeurs des href dans les templates  lorsqu’une URL a changé, de modifier juste la définition de la route • Méthode generateURL() du contrôleur qui reçoit en paramètre le nom de la route • La méthode peut même recevoir éventuellement, en second paramètre, un tableau contenant le paramètre à passer à l’URL 20
  • 21. Routage génération d’URL - exemple 1) À l’action index() • commentez l’instruction return ; • ajoutez les instructions suivantes : $url = $this->generateUrl('hello', ["prenom"=>"Redirected User"]); return $this->redirect($url); 2) Testez le chemin /first 21
  • 22. Contrôleurs sommaire 1) Présentation 2) Réception du contenu a) Via GET b) Via POST 3) Réponse a) Retourner du texte b) Retourner un template 22
  • 23. Contrôleurs présentation • Contrôleur : classe qui regroupe des actions connexes • Action : fonction ou méthode qui reçoit une requête, la traite et retourne une réponse (texte, HTML, XML, JSON, image, redirection, erreur 404, …) • Pour simplifier certain traitement, le contrôleur peut hériter de la classe AbstractController • Exemple : FirstController 23
  • 24. Contrôleurs réception de contenu via GET • GET : méthode HTTP d’envoi qui annexe toute donnée à l’URL • Importer la classe Request use SymfonyComponentHttpFoundationRequest; • Passer en paramètre une instance de Request à l’action qui doit recevoir le contenu via GET • Syntaxe de réception $request->query->get("nomDuContenu") 24
  • 25. Contrôleurs réception de contenu via GET - exemple • Ajouter à FirstController.php use SymfonyComponentHttpFoundationRequest; • Ajouter à hello() le code en rouge public function hello($prenom, Request $request) { $nom = $request->query->get("nom"); return $this->json(['message' => "Hello $prenom $nom !",]); } • Requêter http://localhost:8000/hello/Yero?nom=Sow 25
  • 26. Contrôleurs réception de contenu via POST • POST : méthode HTTP d’envoi qui incorpore toute donnée dans la requête HTTP • Importer la classe Request use SymfonyComponentHttpFoundationRequest; • Passer en paramètre un objet Request à l’action qui doit recevoir le contenu via POST • Syntaxe de réception $request->request->get("nomDuContenu") 26
  • 27. Contrôleurs réception de contenu via POST - exemple • Ajouter à hello() le code en rouge $age = $request->request->get("age"); return $this->json([ 'message' => "Hello $prenom $nom ! Are you $age old ?", ]); • Avec un client REST (ARC ou Postman), faire une requête telle que :  Méthod = POST  URL = http://localhost:8000/hello/Yero?nom=Sow  Paramètre de formulaire : age=32 27
  • 28. Contrôleurs retourner du texte • Importer la classe Response use SymfonyComponentHttpFoundationResponse; • Retourner une instance de Response initialisée avec le texte à retourner return new Response(chaineDeCaracteres); 28
  • 29. Contrôleurs retourner du texte - exemple • Si ce ne pas encore fait, ajouter à FirstController.php use SymfonyComponentHttpFoundationResponse; • Dans hello() commenter les lignes commençant par $age et par return, puis ajouter la ligne suivante return new Response("Bonjour $prenom $nom"); • Requêter http://localhost:8000/hello/Yero?nom=Sow 29
  • 30. Contrôleurs retourner un template • Utilisez la méthode render() qui rend un template (à voir) et place ce contenu dans un objet Response • Syntaxe return $this->render('first/index.html.twig', [ 'controller_name' => 'FirstController', ]); 30
  • 31. Moteur de template Twig sommaire 1) Présentation 2) Installation et emplacement 3) Nommage 4) Expressions 5) Filtres 6) Structures conditionnelles 7) Structures itératives 8) Inclusion d’un template 9) Héritage d’un template 31
  • 32. Moteur de template Twig présentation • Un système de templates gère la disposition générale des éléments de l’interface ainsi que l’aspect visuel de cette interface • Moteur de template = programme qui permet d’intégrer des données dynamiques dans un template • Qlq intérêts  Séparation du traitement et de la présentation PHP ne « sais pas » comment les données seront affichées TWIG ne « sais pas » comment les données sont obtenues  Facilitation du travail en équipe car plus accessible pour les web designers  Rapidité : utilisation d’un cache  Sécurisation des variables 32
  • 33. Moteur de template Twig installation, emplacement et nommage • Installation TWIG commande : composer require twig • Emplacement des templates dossier « template » créé automatiquement par l’installation de Twig • Nommage nom des fichiers et des dossiers en snake case 33
  • 34. Moteur de template Twig expressions • Syntaxe d’affichage d’une expression {{ expression }} • Exemples  Variable simple : {{ age }}  Élément d’un tableau ou champ d’un objet : {{ user.prenom }} 34
  • 35. Moteur de template Twig filtres • Filtre : outil de formatage d’une donnée • Syntaxes d’utilisation  {{ var | filtre }}  {{ var | filtre1 | filtre2 }}  {{ var | filtre(arg) }}  {% filter filtre %} contenu assez consistant à filtrer {% endfilter %} • Quelques filtres  lower / upper / capitalize  date(format,timezone),  join(sep)  number_format(nbr_dec,dec_pt,th_sep)  replace(search,replace) + d’infos : https://twig.symfony.com/doc/3.x/filters/index.html 35
  • 36. Moteur de template Twig structures conditionnelles • {% if bool_expr %} contenu {% endif %} • {% if bool_expr %} contenu {% else %} contenu alternatif {% endif %} • {% if bool_expr1 %} contenu {% elseif bool_expr2 %} contenu alternatif {% else %} autre contenu alternatif {% endif %} 36
  • 37. Moteur de template Twig structures itératives • {% for donnée in ensDeDonnées %} traitement donnée courante {% endfor %} • {% for clé,donnée in ensDeDonnées %} traitement clé et donnée courantes {% endfor %} • {% for donnée in ensDeDonnées if bool_expr %} traitement donnée courante {% endfor %} • {% for donnée in ensDeDonnées %} traitement donnée courante {% else %} traitement ensDeDonnées vide {% endfor %} 37
  • 38. Moteur de template Twig exemple sur les structures de contrôle 1) Ajoutez à FirstController 38 2) Dans templates/first/, éditez notes.html.twig Requêtez le chemin « /notes »
  • 39. Moteur de template Twig inclusion d’un template • Syntaxe d’inclusion d’un template dans un autre {{ include("chemin/vers/template/à/inclure" }} • Le template inclus a accès à toute variable du template enveloppant. 39
  • 40. Moteur de template Twig héritage d’un template • Template de base  contient les éléments communs de l’interface  définit des « blocks » à remplir ou à compléter par des templates enfants {% block nomDuBlock %} … {% endblock %}  Les « blocks » peuvent être imbriqués • Template enfant  doit d’abord étendre le template de base {% extends 'chemin/vers/template/de/base' %}  redéfinit tout « block » qu’il souhaite remplir en oécrasant son contenu de base o rajoutant du contenu avec {{ parent() }}  conserve le contenu de base de tout « block » non redéfini 40
  • 41. Moteur de template Twig exemple template parent Éditez templates/layout.html.twig 41
  • 42. Moteur de template Twig exemple template enfant Éditez templates/first/notes.html.twig 42 Requêtez le chemin « /notes »
  • 43. BDD sommaire 1) Présentation et installation de Doctrine 2) Configurer et créer la base de données 3) Générer une entité 4) Créer la table correspondant à une entité avec les migrations 5) Modifier une entité 6) Persister un nouvel objet 7) Récupérer des objets 8) Modifier un objet 9) Supprimer un objet 43
  • 44. BDD présentation et installation • Doctrine = ORM (Object-Relation Mapper) permettant de faciliter la communication avec une base de données • Entité = classe qui fait correspondre un objet PHP à une table • Objet de l’entité  enregistrement de la table • Commande d’installation de Doctrine composer require symfony/orm-pack 44 Table apprenants id prenom age 1 Ali 23 Classe Apprenant id prenom age Objet Apprenant id : 1 prenom : Ali age : 23 O R M
  • 45. BDD configurer et créer la base de données • Configurer la bdd  Dans la variable d'environnement DATABASE_URL du fichier .env : DATABASE_URL="mysql://db_user:db_password@127.0. 0.1:3306/db_name?serverVersion=5.7"  Exemple DATABASE_URL="mysql://root:@127.0.0.1:3306/symfony -classroom" • Créer la bdd avec la commande (le serveur de bdd doit être actif) php bin/console doctrine:database:create
  • 46. BDD générer une entité • Générer une entité  Commande : php bin/console make:entity script interactif qui demande le nom de l’entité ainsi que les caractéristiques de chacun de ses attributs (id, clé primaire et auto-incrémenté, est créé automatiquement)  Résultat oClasse : src/Entity/Nom_entité.php o Repository : src/Repository/Nom_entitéRepository.php où les requêtes principales seront codées. • Exemple Créer l’entité Apprenant avec les attributs prenom et age. L’id, clé primaire et auto-incrémenté, sera créé automatiquement 46
  • 47. BDD migration • Une migration permet de créer, de mettre à jour et de suivre les évolutions d’un schéma de base de données. • Commande pour créer une migration php bin/console make:migration • La migration (au format VersionDateTime.php) sera créée dans le dossier migrations et contiendra deux méthodes  up() : exécutée lorsque la migration est lancée  down() : exécutée lorsque la migration est annulée • Commande pour lancer les migrations php bin/console doctrine:migrations:migrate • Exemple 1) Créez une migration 2) Lancez les migrations pour que la table apprenants soit créée 47
  • 48. BDD persister un nouvel objet • Dans une action d’un contrôleur 1) Créer un objet de l’entité puis renseigner ses attributs NB : importer la classe de l’entité use AppEntityNom_entité 2) Récupérer le service EntityManager $em = $this->getDoctrine()->getManager(); 3) Signaler le souhait de persister l’objet (aucune requête SQL ne sera exécutée à ce stade) $em->persist(nomObjet); 4) Demander l’exécution de la requête d’insertion $em->flush(); • L’objet inséré reçoit un id récupérable par $nomObjet->getId() • Les transactions expliquent $em->persist() et $em->flush() 48
  • 49. BDD persister un nouvel objet - exemple 49 Testez avec un client REST Dans FirstController, ajoutez use AppEntityApprenant; et l’action suivante :
  • 50. BDD récupérer des objets • Dans une action d’un contrôleur 1) récupérer le repository de l'entité $repo = $this->getDoctrine()->getRepository(NomEntité::class) 2) Récupérer l’entité avec la methode find() du repository $nomObjet = $repo->find($id); • Autres méthodes du repository  findOneBy(['nomAttribut1' => Valeur, 'nomAttribut2' => Valeur, …]) trouver un objet à partir d’un ou de +sieurs de ses attributs  findBy(['nomAttribut1' => Valeur], ['nomAttribut2' => Valeur], …) trouver +sieurs objets à partir d’un ou de +sieurs d’attributs  findAll() trouver tous les objets 50
  • 51. BDD récupérer un objet - exemple 51 Testez les chemins « apprenants/1 » et « apprenants/0 »
  • 52. BDD modifier un objet Dans une action d’un contrôleur 1) Récupérez le service EntityManager $em = $this->getDoctrine()->getManager(); 2) Récupérez l’objet avec la methode find() du repository $nomObjet = $em->getRepository(NomEntité::class)- >find($id) 3) Modifier l’objet 4) Invoquez la méthode flush() de l’EntityManager 52
  • 53. BDD modifier un objet - exemple 53 Requêtez « apprenants/1 » avec comme méthode PUT
  • 54. BDD supprimer un objet Dans une action d’un contrôleur 1) Récupérez le service EntityManager $em = $this->getDoctrine()->getManager(); 2) Récupérez l’objet avec la methode find() du repository $nomObjet = $em->getRepository(NomEntité::class)->find($id); 3) Invoquez la méthode remove() de l’EntityManager $em->remove($nomObjet); 4) Invoquez la méthode flush() de l’EntityManager 54
  • 55. Formulaires sommaire 1) Présentation 2) Construction 3) Affichage 4) Gestion de la soumission 55
  • 56. Formulaires présentation et installation • Formulaire = interface entre l’utilisateur et l’application • Principal objectif : permettre à un utilisateur d’initialiser ou de modifier les attributs d'un objet métier (ex : apprenant) • Commande pour installer les fonctionnalités des formulaires composer require symfony/form 56
  • 57. Formulaires construction Dans une action d’un contrôleur 1) Créer un objet métier NB : sa classe est à importer 2) Créer un objet formBuilder avec le constructeur createFormBuilder() recevant en paramètre l’objet métier 3) Ajouter un (ou +sieurs) champ(s) au formulaire à construire avec la méthode add() du formBuilder. add() reçoit a) le nom d’un attribut de l’objet métier ou bien 'save' (bouton de soumission) b) le nom de la classe du type de cet attribut NB : la classe est à importer 4) Récupérer le formulaire créé avec getForm() du formBuilder 5) Permettre l’affichage du formulaire dans une vue avec createView() du formulaire 57
  • 59. Formulaires affichage • Afficher le formulaire avec l’une des méthodes (form en paramètre est une variable transmise par le contrôleur ) 1) {{ form(form) }} 2) {{ form_start(form) }} {{ form_widget(form) }} {{ form_end(form) }} • Personnaliser un label 1) {{ form_label(form.NomAttribut, 'Label personnalisé') }} 2) {{ form_widget(form.NomAttribut) }} pour afficher le champ associé au label 59
  • 60. Formulaires affichage - exemple 60 Requêtez « apprenants » avec un navigateur
  • 61. Formulaires gestion de la soumission Dans l’action où a été construite le formulaire, juste après avoir récupéré l’objet formulaire 1) Récupérer les données soumises et hydrater l’objet métier grâce à la méthode handleRequest() de l’objet formulaire 2) Vérifier la validité des données soumises avec la méthode isValid() de l’objet formulaire avant de traiter (sauvegarder en base de données, intégrer dans une réponse, …) l’objet métier 61
  • 62. Formulaires gestion de la soumission - exemple 62 Requêtez « apprenants » avec un navigateur
  • 63. Références • https://symfony.com/doc/5.2/setup.html • https://symfony.com/doc/5.2/page_creation.html • https://symfony.com/doc/5.2/routing.html • https://symfony.com/doc/5.2/controller.html • https://symfony.com/doc/5.2/templates.html • https://symfony.com/doc/5.2/doctrine.html • https://symfony.com/doc/5.2/forms.html 63

Notes de l'éditeur

  • #7: https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2/symfony2-un-framework-php http://blog.webodrey.fr/post/utiliser-un-framework-php-est-ce-toujours-un-bon-choix
  • #8: LTS : Long-Term Support 3.4 est supportée jusqu’en nov 2020
  • #9: http://symfony.com/doc/5.2/reference/requirements.html Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #10: https://symfony.com/doc/5.2/setup.html https://getcomposer.org/download/
  • #11: composer create-project symfony/framework-standard-edition nomDuProjet pour la dernière version stable https://symfony.com/doc/5.2/setup.html https://getcomposer.org/download/ En cas de Pbl de timezone php -i | grep php.ini open etc/ Créer php.ini en dupliquant php.ini.default date.timezone = « Africa/Dakar » En cas d’erreur : Cannot redeclare class Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser Dans Web/app_dev.php, commenter la ligne «$kernel->loadClassCache(); » 
  • #18: Problème 2 : pour charger une vue unable to find template index.html.twig symfony 3.4   Solution Dans app/config/config.yml, dans la partie « Framework : » rajouter templating: engines: ['twig']
  • #28: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #29: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #30: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #31: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #32: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #33: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #34: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #35: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #36: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #38: {% for user in users if user.active %} <li>{{ user.username|e }}</li> {% endfor %}
  • #40: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #41: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #42: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #43: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #46: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #47: Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #48: https://laravel.com/docs/7.x/migrations
  • #51: https://symfony.com/doc/5.2/doctrine.html
  • #52: https://symfony.com/doc/5.2/doctrine.html
  • #53: https://symfony.com/doc/5.2/doctrine.html
  • #54: https://symfony.com/doc/5.2/doctrine.html
  • #55: https://symfony.com/doc/5.2/doctrine.html
  • #58: https://symfony.com/doc/5.2/doctrine.html
  • #59: https://symfony.com/doc/5.2/doctrine.html
  • #60: https://symfony.com/doc/5.2/doctrine.html
  • #61: https://symfony.com/doc/5.2/doctrine.html
  • #62: https://symfony.com/doc/5.2/doctrine.html