SlideShare une entreprise Scribd logo
Introduction
à
M. Abdoulaye DIENG Février 2018
ESMT / LPTI 3 DAR
Licence Professionnelle en Télécommunications et Informatique
Développement d'Applications Réparties
Objectif général
Prendre en main l’un des framework PHP
les plus utilisés
2
Objectifs opérationnels
• Structurer les fonctionnalités grâce aux bundles
• 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) Bundle
3) Routage
4) Contrôleurs
5) Twig
6) Entités
7) 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
5
Préliminaires
Qu’est ce qu’un Framework ?
• Problématiques
Comment faciliter le développement d’une application ?
• Solution : Framework
• Framework = cadre de travail ou boîte à outils conçu par et
pour les développeurs
• 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 LTS (en fev 2018) : 3.4
• Adopté par Dailymotion, OpenClassrooms, Drupal,
BlaBlaCar, …
• Concurrencé par Laravel, CodeIgniter, Zend Framework,
CakePHP, …
Source : https://symfony.com/what-is-symfony le 4/2/2018
7
Préliminaires
prérequis pour installer Symfony
• Version de PHP ≥ 5.5.9
• Activer JSON
• Activer ctype
• Paramètrer date.timezone dans php.ini
• Prérequis pour utiliser Doctrine :
 Activer PDO
 Installer le pilote PDO du serveur de bdd à utiliser.
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
• Désactiver, éventuellement l’extension xdebug dans php.ini
• Créer un nouveau projet Symfony (ici avec la version 3.1.6)
composer create-project symfony/framework-standard-edition nomDuProjet
"3.1.6"
• Démarrer le projet avec les commandes :
cd nomDuProjet/
php bin/console server:run
• 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
• Créer un nouveau projet Symfony (ici avec la version 3.1.6)
composer create-project symfony/framework-standard-edition nomDuProjet
"3.1.6"
• Démarrer le projet avec les commandes :
cd nomDuProjet/
php bin/console server:run
• Accéder à la page d’accueil de Symfony à l’adresse 10
Bundle
sommaire
1) Présentation & nommage
2) Création
3) Structure des répertoires
11
Bundle
présentation & nommage
• Bundle = ensemble de fichiers et répertoires permettant
d'implémenter une ou des fonctionnalités
Exemples : BlogBundle, ForumBundle
• Intérêt
 Séparation
 Activation / désactivation
 Partage
• Nommage d’un bundle
 Utiliser uniquement des noms alphanumériques et des
underscore
 Utiliser des noms de notation dite « UpperCamelCase »
 Suffixer toujours le nom du bundle avec « Bundle »
12
Bundle
création
• Une fois dans le dossier de l’application, exécuter la commande
php bin/console generate:bundle
• Puis répondre aux questions :
1) A partager ou pas ? (non par défaut)
2) Nom du bundle ?
3) Répertoire de destination du bundle (src/ par défaut)
4) Format de configuration du bundle ? (annotation par
défaut)
• Ensuite le bundle est créé, chargé et activé
• Exemple
créez HelloBundle
13
Bundle
structure des répertoires
NomBundle
NomBundle.php
Bundle de
symfony
Contrôleurs
du bundle
Fichiers de
configuration
du bundle
Templates du
bundle
NomBundle.php
NomBundle
Répertoire du
bundle
Contient la classe
déclarant le
bundle 14
Routage
sommaire
1) Présentation
2) Définition en annotation
3) Définition en YAML
4) Route avec des paramètres
5) Route à paramètres optionnels
6) Génération d’URL
15
Routage
présentation
• 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
16
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("/", name="accueil")
*/
17
Routage
définition en YAML
• Emplacement
dans un fichier de configuration routing.yml du dossier config du
bundle
• Syntaxe (retrait = 4 espaces)
nomRoute:
path: path d’URL
defaults: { _controller:
NomBundle:NomController:nomAction }
• Exemple
accueil:
path: 
defaults: { _controller: HelloBundle:Default:index }
18
Routage
route avec paramètre
Syntaxes d’ajout du paramètre
1) Suffixer {nomParametre} au path
2) Passer $nomParametre en paramètre à l’action du
contrôleur
19
Routage
route avec paramètre - exemple
• Définir cette route
/**
* @Route("/salut/{prenom}", name="salut")
*/
public function salutAction($prenom) {
return $this-
>render(’HelloBundle:Default:index.html.twig',
array("prenom"=>$prenom) );
}
• Dans index.html.twig, remplacer World par {{prenom}}
• Tester les chemins /salut/VotrePrenom
20
Routage
route avec paramètre optionnel
Syntaxes d’ajout du paramètre optionnel
1) Suffixer {nomParametre} au path
2) Ajouter à @Route la propriété
defaults={"nomParametre": valeurParDefaut}
3) Passer $nomParametre en paramètre à l’action du
contrôleur
21
Routage
route avec paramètre optionnel - exemple
• Définir cette route
/**
* @Route("/salut/{prenom}", defaults={"prenom":"World"},
name="salut")
*/
public function helloAction($prenom) {
return $this->render(’HelloBundle:Default:index.html.twig',
array("prenom"=>$prenom) );
}
• Dans index.html.twig, remplacer World par {{prenom}}
• Tester les chemins
 /salut/VotrePrenom
 /salut
22
Routage
génération d’URL
• 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
• Exemple
1) Commenter l’unique instruction de indexAction() puis
ajouter les instructions suivantes :
$url = $this->generateUrl('salut',
array("prenom"=>"Utilisateur redirigé"));
return $this->redirect($url);
2) Tester le chemin /
23
Contrôleurs
sommaire
1) Présentation
2) Exemple
3) Réception du contenu
a) Via GET
b) Via POST
c) Autre méthode l’objet Request
4) Réponse
a) Retourner du texte
b) Retourner du JSON
24
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 Controller
25
Contrôleurs
exemple
namespace HelloBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use
SensioBundleFrameworkExtraBundleConfigurationRoute;
class DefaultController extends Controller{
/**
* @Route("/",)
*/
public function indexAction() {
return $this-
>render(’HelloBundle:Default:index.html.twig');
}
}
26
Contrôleurs
réception de contenu via GET
• Importer la classe Request
use SymfonyComponentHttpFoundationRequest;
• Passer en paramètre un objet Request à l’action qui doit
recevoir le contenu via GET
• Syntaxe de réception
$request->query->get("nomDuContenu")
27
Contrôleurs
réception de contenu via GET - exemple
• Ajouter à DefaultController.php
use SymfonyComponentHttpFoundationRequest;
• Ajouter à salutAction le code en rouge
public function salutAction($prenom, Request $request) {
$nom = $request->query->get("nom");
return $this-
>render('HelloBundle:Default:index.html.twig',
array("prenom"=>$prenom,"nom"=>$nom) );
}
• Contenu de index.html.twig,
Hello {{prenom}} {{nom}} !
• Requêter
http://localhost:8000/salut/Yero?nom=Sow
28
Contrôleurs
réception de contenu via POST
• 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")
29
Contrôleurs
réception de contenu via POST - exemple
• Ajouter à salutAction() l’instruction
$age = $request->request->get("age");
• Contenu de index.html.twig,
Hello {{prenom}} {{nom}} ! Are you {{age}} years old ?
• Installer sur le navigateur un client REST (ARC ou Postman),
puis faire une requête telle que :
 Méthode = POST
 URL = http://localhost:8000/salut/Yero?nom=Sow
 Paramètre de formulaire : age=32
30
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);
31
Contrôleurs
retourner du texte - exemple
• Ajouter à DefaultController.php
use SymfonyComponentHttpFoundationResponse;
• Dans salutAction 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/salut/Yero?nom=Sow
32
Contrôleurs
retourner du JSON
• Importer la classe Response
use SymfonyComponentHttpFoundationResponse;
• Retourner une instance de Response initialisée avec l’objet
JSON à retourner
return new Response(objetJSON)
33
Contrôleurs
retourner du JSON - exemple
• Ajouter à DefaultController.php
use SymfonyComponentHttpFoundationResponse;
• Dans salutAction(), commenter les lignes commençant par $age
et par return, puis ajouter la ligne suivante
return new Response( json_encode( array(
"prenom"=>$prenom, "nom"=>$nom)));
• Requêter
http://localhost:8000/salut/Yero?nom=Sow
34
Moteur de template Twig
sommaire
1) Présentation
2) Expressions
3) Filtres
4) Structures conditionnelles
5) Structures itératives
6) Héritage d’un template
7) Inclusion d’un template
35
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 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
36
Moteur de template Twig
expressions
• Syntaxe d’affichage d’une expression
{{ expression }}
• Exemples
 Variable simple : {{ age }}
 Élément d’un tableau : {{ user['prenom'] }}
 Attribut d’un objet : {{ user.prenom }}
• Syntaxe de définition d’une variable
{% set nom = valeur %}
• Exemples
 {% set foo = 'foo' %}
 {% set foo = [ 1, 2] %}
 {% set foo = {'foo' : 'bar' } %}
37
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 à filtrer {% endfilter %}
• Qlq 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/2.x/filters/index.html38
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 %} 39
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 %} 40
Moteur de template Twig
structures itératives - exemples
1) Dans indexAction()
a) Créer le tableau $prenoms contenant des prénoms
b) Retourner le template index en lui passant $prenoms
2) Dans index.html.twig
a) Afficher la liste des prénoms en majuscules
b) Prévoir le cas où le tableau $prenoms est vide
41
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
orajoutant du contenu avec {{ parent() }}
 conserve le contenu de base de tout « block » non redéfini
42
Moteur de template Twig
exemple template parent
HelloBundle/Ressources/views/layout.html.twig
43
Moteur de template Twig
exemple template enfant
HelloBundle/Ressources/views/Default/child.html.twig
44
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.
45
Entités
sommaire
1) Présentation
2) Configurer et créer la base de données
3) Générer une entité et sa table correspondante
4) Modifier une entité
5) Persister un nouvel objet
6) Récupérer des objets
7) Modifier un objet
8) Supprimer un objet
46
Entités
présentation
• 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
47
Entités
configurer et créer la base de données
• Configurer la bdd
 Dans App/Config/parameters.yml : assigner des valeurs
aux paramètres : database_host, database_port,
database_name, database_user,
database_password
 Exemple
parameters:
database_host: 127.0.0.1
database_port: 8889
database_name: arene
database_user: root
database_password: root
(Valeurs prises dans config.inc.php de PhpMyAdmin du MAMP 4.2)
• Créer la bdd avec la commande
php bin/console doctrine:database:create
48
Entités
générer une entité et sa table correspondante
• Générer une entité
 php bin/console doctrine:generate:entity
(script interactif)
 Résultat
o Classe :
src/NomBundle/Entity/Nom_entité.php
oRepository :
src/NomBundle/Repository/Nom_entitéRepository.php
(initialement vide) où les requêtes principales seront
codées.
• Créer la table correspondante dans la bdd
php bin/console doctrine:schema:update --force
• Exemple
Créer l’entité lutteur avec les attributs id, pseudo et poids
49
Entités
modifier une entité
Pour modifier une entité
1) créer un nouvel attribut et lui attacher l'annotation
correspondante.
2) créer le getter et le setter ou utiliser la commande
doctrine:generate:entities NomBundle:NomEntité
3) enregistrer la modification du schéma en bdd
doctrine:schema:update --force
50
Entités
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 NomBundleEntityNom_entité
2) Récupérez 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()
51
Entités
persister un nouvel objet - exemple
52
Entités
récupérer des objets
• Dans une action d’un contrôleur
1) récupérer le repository de l'entité
$repository = $this->getDoctrine()->getManager()->
getRepository('NomBundle:NomEntité');
2) Récupérer l’entité avec la methode find() du repository
$nomObjet = $repository->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
53
Entités
récupérer un objet - exemple
54
Entités
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('NomBundle:NomEntité')-
>find($id)
3) Modifier l’objet
4) Invoquez la méthode flush() de l’EntityManager
55
Entités
modifier un objet - exemple
56
Entités
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('NomBundle:NomEntité')-
>find($id);
3) Invoquez la méthode remove() de l’EntityManager
$em->remove($nomObjet);
4) Invoquez la méthode flush() de l’EntityManager
57
Formulaires
sommaire
1) Présentation
2) Construction
3) Affichage
4) Gestion de la soumission
58
Formulaires
présentation
• 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 : lutteur)
59
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
60
Formulaires
construction - exemple
61
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
62
Formulaires
affichage - exemple
63
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
64
Formulaires
gestion de la soumission - exemple
65

Contenu connexe

Tendances

Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
ENSET, Université Hassan II Casablanca
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
ENSET, Université Hassan II Casablanca
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
Faycel Chaoua
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
ENSET, Université Hassan II Casablanca
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
ENSET, Université Hassan II Casablanca
 
Presentation Symfony
Presentation SymfonyPresentation Symfony
Presentation Symfony
Jeremy Gachet
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
ENSET, Université Hassan II Casablanca
 
Microservices avec Spring Cloud
Microservices avec Spring CloudMicroservices avec Spring Cloud
Microservices avec Spring Cloud
Florian Beaufumé
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
ENSET, Université Hassan II Casablanca
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
ENSET, Université Hassan II Casablanca
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
pierrepo
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
ENSET, Université Hassan II Casablanca
 
Angular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHTAngular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHT
tayebbousfiha1
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
Mouna Torjmen
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
ENSET, Université Hassan II Casablanca
 
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide CompletAlphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
Ines Ouaz
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
Kristen Le Liboux
 
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrapApplication web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
Bassem ABCHA
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web services
Lilia Sfaxi
 

Tendances (20)

Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
 
Presentation Symfony
Presentation SymfonyPresentation Symfony
Presentation Symfony
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Microservices avec Spring Cloud
Microservices avec Spring CloudMicroservices avec Spring Cloud
Microservices avec Spring Cloud
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Angular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHTAngular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHT
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide CompletAlphorm.com Formation Big Data & Hadoop : Le Guide Complet
Alphorm.com Formation Big Data & Hadoop : Le Guide Complet
 
Examen principal- php - correction
Examen principal- php - correctionExamen principal- php - correction
Examen principal- php - correction
 
Un exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHPUn exemple élémentaire d'application MVC en PHP
Un exemple élémentaire d'application MVC en PHP
 
Application web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrapApplication web php5 html5 css3 bootstrap
Application web php5 html5 css3 bootstrap
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web services
 

Similaire à Introduction à Symfony

Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
Abdoulaye Dieng
 
Atelier symfony n 2
Atelier symfony n 2Atelier symfony n 2
Atelier symfony n 2
Amir Souissi
 
Symfony3 overview
Symfony3 overviewSymfony3 overview
Symfony3 overview
SymfonyMu
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2
Ahmed ABATAL
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
Hugo Hamon
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
jeUXdiCode
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
Atsé François-Xavier KOBON
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
kemenaran
 
Framework php « Codeignitor »
Framework php « Codeignitor » Framework php « Codeignitor »
Framework php « Codeignitor »
ODC Orange Developer Center
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
Noel GUILBERT
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
Hugo Hamon
 
Symfony 2 : chapitre 1 - Présentation Générale
Symfony 2 : chapitre 1 - Présentation GénéraleSymfony 2 : chapitre 1 - Présentation Générale
Symfony 2 : chapitre 1 - Présentation Générale
Abdelkader Rhouati
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
Vincent Composieux
 
Etude des Frameworks PHP
Etude des Frameworks PHPEtude des Frameworks PHP
Etude des Frameworks PHP
JEAN-GUILLAUME DUJARDIN
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
Abdoulaye Dieng
 
Atelier Symfony2- Introduction
Atelier Symfony2- IntroductionAtelier Symfony2- Introduction
Atelier Symfony2- Introduction
Marwa OUNALLI
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng
 
À La découverte de flow3 - t3con12
À La découverte de flow3 -  t3con12À La découverte de flow3 -  t3con12
À La découverte de flow3 - t3con12
mguermazi
 
Docker, mais qu’est-ce que c’est ?
Docker, mais qu’est-ce que c’est ?Docker, mais qu’est-ce que c’est ?
Docker, mais qu’est-ce que c’est ?
Julien Maitrehenry
 
Powershell
PowershellPowershell
Powershell
UGAIA
 

Similaire à Introduction à Symfony (20)

Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
Atelier symfony n 2
Atelier symfony n 2Atelier symfony n 2
Atelier symfony n 2
 
Symfony3 overview
Symfony3 overviewSymfony3 overview
Symfony3 overview
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2
 
Introduction à Symfony2
Introduction à Symfony2Introduction à Symfony2
Introduction à Symfony2
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Formation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHPFormation PHP avancé - Cake PHP
Formation PHP avancé - Cake PHP
 
Framework php « Codeignitor »
Framework php « Codeignitor » Framework php « Codeignitor »
Framework php « Codeignitor »
 
Symfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiquesSymfony2: 30 astuces et bonnes pratiques
Symfony2: 30 astuces et bonnes pratiques
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
Symfony 2 : chapitre 1 - Présentation Générale
Symfony 2 : chapitre 1 - Présentation GénéraleSymfony 2 : chapitre 1 - Présentation Générale
Symfony 2 : chapitre 1 - Présentation Générale
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Etude des Frameworks PHP
Etude des Frameworks PHPEtude des Frameworks PHP
Etude des Frameworks PHP
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
Atelier Symfony2- Introduction
Atelier Symfony2- IntroductionAtelier Symfony2- Introduction
Atelier Symfony2- Introduction
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
À La découverte de flow3 - t3con12
À La découverte de flow3 -  t3con12À La découverte de flow3 -  t3con12
À La découverte de flow3 - t3con12
 
Docker, mais qu’est-ce que c’est ?
Docker, mais qu’est-ce que c’est ?Docker, mais qu’est-ce que c’est ?
Docker, mais qu’est-ce que c’est ?
 
Powershell
PowershellPowershell
Powershell
 

Plus de Abdoulaye Dieng

Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
Abdoulaye Dieng
 
Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturel
Abdoulaye Dieng
 
Panorama des Technologies mobiles
Panorama des Technologies mobilesPanorama des Technologies mobiles
Panorama des Technologies mobiles
Abdoulaye Dieng
 
Prise en main de WordPress
Prise en main de WordPressPrise en main de WordPress
Prise en main de WordPress
Abdoulaye Dieng
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
Abdoulaye Dieng
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
Abdoulaye Dieng
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
Abdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
Abdoulaye Dieng
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
Abdoulaye Dieng
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
Abdoulaye Dieng
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
Abdoulaye Dieng
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
Abdoulaye Dieng
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
Abdoulaye Dieng
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
Abdoulaye Dieng
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
Abdoulaye Dieng
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
Abdoulaye Dieng
 
Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
Abdoulaye Dieng
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
Abdoulaye Dieng
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
Abdoulaye Dieng
 

Plus de Abdoulaye Dieng (20)

Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturel
 
Panorama des Technologies mobiles
Panorama des Technologies mobilesPanorama des Technologies mobiles
Panorama des Technologies mobiles
 
Prise en main de WordPress
Prise en main de WordPressPrise en main de WordPress
Prise en main de WordPress
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Fondamentaux d’une API REST
Fondamentaux d’une API RESTFondamentaux d’une API REST
Fondamentaux d’une API REST
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Introduction à jQuery
Introduction à jQueryIntroduction à jQuery
Introduction à jQuery
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Initiation à l'algorithmique
Initiation à l'algorithmiqueInitiation à l'algorithmique
Initiation à l'algorithmique
 
Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 

Introduction à Symfony

  • 1. Introduction à M. Abdoulaye DIENG Février 2018 ESMT / LPTI 3 DAR Licence Professionnelle en Télécommunications et Informatique Développement d'Applications Réparties
  • 2. Objectif général Prendre en main l’un des framework PHP les plus utilisés 2
  • 3. Objectifs opérationnels • Structurer les fonctionnalités grâce aux bundles • 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) Bundle 3) Routage 4) Contrôleurs 5) Twig 6) Entités 7) 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 5
  • 6. Préliminaires Qu’est ce qu’un Framework ? • Problématiques Comment faciliter le développement d’une application ? • Solution : Framework • Framework = cadre de travail ou boîte à outils conçu par et pour les développeurs • 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 LTS (en fev 2018) : 3.4 • Adopté par Dailymotion, OpenClassrooms, Drupal, BlaBlaCar, … • Concurrencé par Laravel, CodeIgniter, Zend Framework, CakePHP, … Source : https://symfony.com/what-is-symfony le 4/2/2018 7
  • 8. Préliminaires prérequis pour installer Symfony • Version de PHP ≥ 5.5.9 • Activer JSON • Activer ctype • Paramètrer date.timezone dans php.ini • Prérequis pour utiliser Doctrine :  Activer PDO  Installer le pilote PDO du serveur de bdd à utiliser. 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 • Désactiver, éventuellement l’extension xdebug dans php.ini • Créer un nouveau projet Symfony (ici avec la version 3.1.6) composer create-project symfony/framework-standard-edition nomDuProjet "3.1.6" • Démarrer le projet avec les commandes : cd nomDuProjet/ php bin/console server:run • 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 • Créer un nouveau projet Symfony (ici avec la version 3.1.6) composer create-project symfony/framework-standard-edition nomDuProjet "3.1.6" • Démarrer le projet avec les commandes : cd nomDuProjet/ php bin/console server:run • Accéder à la page d’accueil de Symfony à l’adresse 10
  • 11. Bundle sommaire 1) Présentation & nommage 2) Création 3) Structure des répertoires 11
  • 12. Bundle présentation & nommage • Bundle = ensemble de fichiers et répertoires permettant d'implémenter une ou des fonctionnalités Exemples : BlogBundle, ForumBundle • Intérêt  Séparation  Activation / désactivation  Partage • Nommage d’un bundle  Utiliser uniquement des noms alphanumériques et des underscore  Utiliser des noms de notation dite « UpperCamelCase »  Suffixer toujours le nom du bundle avec « Bundle » 12
  • 13. Bundle création • Une fois dans le dossier de l’application, exécuter la commande php bin/console generate:bundle • Puis répondre aux questions : 1) A partager ou pas ? (non par défaut) 2) Nom du bundle ? 3) Répertoire de destination du bundle (src/ par défaut) 4) Format de configuration du bundle ? (annotation par défaut) • Ensuite le bundle est créé, chargé et activé • Exemple créez HelloBundle 13
  • 14. Bundle structure des répertoires NomBundle NomBundle.php Bundle de symfony Contrôleurs du bundle Fichiers de configuration du bundle Templates du bundle NomBundle.php NomBundle Répertoire du bundle Contient la classe déclarant le bundle 14
  • 15. Routage sommaire 1) Présentation 2) Définition en annotation 3) Définition en YAML 4) Route avec des paramètres 5) Route à paramètres optionnels 6) Génération d’URL 15
  • 16. Routage présentation • 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 16
  • 17. 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("/", name="accueil") */ 17
  • 18. Routage définition en YAML • Emplacement dans un fichier de configuration routing.yml du dossier config du bundle • Syntaxe (retrait = 4 espaces) nomRoute: path: path d’URL defaults: { _controller: NomBundle:NomController:nomAction } • Exemple accueil: path: defaults: { _controller: HelloBundle:Default:index } 18
  • 19. Routage route avec paramètre Syntaxes d’ajout du paramètre 1) Suffixer {nomParametre} au path 2) Passer $nomParametre en paramètre à l’action du contrôleur 19
  • 20. Routage route avec paramètre - exemple • Définir cette route /** * @Route("/salut/{prenom}", name="salut") */ public function salutAction($prenom) { return $this- >render(’HelloBundle:Default:index.html.twig', array("prenom"=>$prenom) ); } • Dans index.html.twig, remplacer World par {{prenom}} • Tester les chemins /salut/VotrePrenom 20
  • 21. Routage route avec paramètre optionnel Syntaxes d’ajout du paramètre optionnel 1) Suffixer {nomParametre} au path 2) Ajouter à @Route la propriété defaults={"nomParametre": valeurParDefaut} 3) Passer $nomParametre en paramètre à l’action du contrôleur 21
  • 22. Routage route avec paramètre optionnel - exemple • Définir cette route /** * @Route("/salut/{prenom}", defaults={"prenom":"World"}, name="salut") */ public function helloAction($prenom) { return $this->render(’HelloBundle:Default:index.html.twig', array("prenom"=>$prenom) ); } • Dans index.html.twig, remplacer World par {{prenom}} • Tester les chemins  /salut/VotrePrenom  /salut 22
  • 23. Routage génération d’URL • 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 • Exemple 1) Commenter l’unique instruction de indexAction() puis ajouter les instructions suivantes : $url = $this->generateUrl('salut', array("prenom"=>"Utilisateur redirigé")); return $this->redirect($url); 2) Tester le chemin / 23
  • 24. Contrôleurs sommaire 1) Présentation 2) Exemple 3) Réception du contenu a) Via GET b) Via POST c) Autre méthode l’objet Request 4) Réponse a) Retourner du texte b) Retourner du JSON 24
  • 25. 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 Controller 25
  • 26. Contrôleurs exemple namespace HelloBundleController; use SymfonyBundleFrameworkBundleControllerController; use SensioBundleFrameworkExtraBundleConfigurationRoute; class DefaultController extends Controller{ /** * @Route("/",) */ public function indexAction() { return $this- >render(’HelloBundle:Default:index.html.twig'); } } 26
  • 27. Contrôleurs réception de contenu via GET • Importer la classe Request use SymfonyComponentHttpFoundationRequest; • Passer en paramètre un objet Request à l’action qui doit recevoir le contenu via GET • Syntaxe de réception $request->query->get("nomDuContenu") 27
  • 28. Contrôleurs réception de contenu via GET - exemple • Ajouter à DefaultController.php use SymfonyComponentHttpFoundationRequest; • Ajouter à salutAction le code en rouge public function salutAction($prenom, Request $request) { $nom = $request->query->get("nom"); return $this- >render('HelloBundle:Default:index.html.twig', array("prenom"=>$prenom,"nom"=>$nom) ); } • Contenu de index.html.twig, Hello {{prenom}} {{nom}} ! • Requêter http://localhost:8000/salut/Yero?nom=Sow 28
  • 29. Contrôleurs réception de contenu via POST • 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") 29
  • 30. Contrôleurs réception de contenu via POST - exemple • Ajouter à salutAction() l’instruction $age = $request->request->get("age"); • Contenu de index.html.twig, Hello {{prenom}} {{nom}} ! Are you {{age}} years old ? • Installer sur le navigateur un client REST (ARC ou Postman), puis faire une requête telle que :  Méthode = POST  URL = http://localhost:8000/salut/Yero?nom=Sow  Paramètre de formulaire : age=32 30
  • 31. 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); 31
  • 32. Contrôleurs retourner du texte - exemple • Ajouter à DefaultController.php use SymfonyComponentHttpFoundationResponse; • Dans salutAction 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/salut/Yero?nom=Sow 32
  • 33. Contrôleurs retourner du JSON • Importer la classe Response use SymfonyComponentHttpFoundationResponse; • Retourner une instance de Response initialisée avec l’objet JSON à retourner return new Response(objetJSON) 33
  • 34. Contrôleurs retourner du JSON - exemple • Ajouter à DefaultController.php use SymfonyComponentHttpFoundationResponse; • Dans salutAction(), commenter les lignes commençant par $age et par return, puis ajouter la ligne suivante return new Response( json_encode( array( "prenom"=>$prenom, "nom"=>$nom))); • Requêter http://localhost:8000/salut/Yero?nom=Sow 34
  • 35. Moteur de template Twig sommaire 1) Présentation 2) Expressions 3) Filtres 4) Structures conditionnelles 5) Structures itératives 6) Héritage d’un template 7) Inclusion d’un template 35
  • 36. 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 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 36
  • 37. Moteur de template Twig expressions • Syntaxe d’affichage d’une expression {{ expression }} • Exemples  Variable simple : {{ age }}  Élément d’un tableau : {{ user['prenom'] }}  Attribut d’un objet : {{ user.prenom }} • Syntaxe de définition d’une variable {% set nom = valeur %} • Exemples  {% set foo = 'foo' %}  {% set foo = [ 1, 2] %}  {% set foo = {'foo' : 'bar' } %} 37
  • 38. 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 à filtrer {% endfilter %} • Qlq 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/2.x/filters/index.html38
  • 39. 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 %} 39
  • 40. 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 %} 40
  • 41. Moteur de template Twig structures itératives - exemples 1) Dans indexAction() a) Créer le tableau $prenoms contenant des prénoms b) Retourner le template index en lui passant $prenoms 2) Dans index.html.twig a) Afficher la liste des prénoms en majuscules b) Prévoir le cas où le tableau $prenoms est vide 41
  • 42. 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 orajoutant du contenu avec {{ parent() }}  conserve le contenu de base de tout « block » non redéfini 42
  • 43. Moteur de template Twig exemple template parent HelloBundle/Ressources/views/layout.html.twig 43
  • 44. Moteur de template Twig exemple template enfant HelloBundle/Ressources/views/Default/child.html.twig 44
  • 45. 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. 45
  • 46. Entités sommaire 1) Présentation 2) Configurer et créer la base de données 3) Générer une entité et sa table correspondante 4) Modifier une entité 5) Persister un nouvel objet 6) Récupérer des objets 7) Modifier un objet 8) Supprimer un objet 46
  • 47. Entités présentation • 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 47
  • 48. Entités configurer et créer la base de données • Configurer la bdd  Dans App/Config/parameters.yml : assigner des valeurs aux paramètres : database_host, database_port, database_name, database_user, database_password  Exemple parameters: database_host: 127.0.0.1 database_port: 8889 database_name: arene database_user: root database_password: root (Valeurs prises dans config.inc.php de PhpMyAdmin du MAMP 4.2) • Créer la bdd avec la commande php bin/console doctrine:database:create 48
  • 49. Entités générer une entité et sa table correspondante • Générer une entité  php bin/console doctrine:generate:entity (script interactif)  Résultat o Classe : src/NomBundle/Entity/Nom_entité.php oRepository : src/NomBundle/Repository/Nom_entitéRepository.php (initialement vide) où les requêtes principales seront codées. • Créer la table correspondante dans la bdd php bin/console doctrine:schema:update --force • Exemple Créer l’entité lutteur avec les attributs id, pseudo et poids 49
  • 50. Entités modifier une entité Pour modifier une entité 1) créer un nouvel attribut et lui attacher l'annotation correspondante. 2) créer le getter et le setter ou utiliser la commande doctrine:generate:entities NomBundle:NomEntité 3) enregistrer la modification du schéma en bdd doctrine:schema:update --force 50
  • 51. Entités 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 NomBundleEntityNom_entité 2) Récupérez 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() 51
  • 52. Entités persister un nouvel objet - exemple 52
  • 53. Entités récupérer des objets • Dans une action d’un contrôleur 1) récupérer le repository de l'entité $repository = $this->getDoctrine()->getManager()-> getRepository('NomBundle:NomEntité'); 2) Récupérer l’entité avec la methode find() du repository $nomObjet = $repository->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 53
  • 55. Entités 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('NomBundle:NomEntité')- >find($id) 3) Modifier l’objet 4) Invoquez la méthode flush() de l’EntityManager 55
  • 57. Entités 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('NomBundle:NomEntité')- >find($id); 3) Invoquez la méthode remove() de l’EntityManager $em->remove($nomObjet); 4) Invoquez la méthode flush() de l’EntityManager 57
  • 58. Formulaires sommaire 1) Présentation 2) Construction 3) Affichage 4) Gestion de la soumission 58
  • 59. Formulaires présentation • 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 : lutteur) 59
  • 60. 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 60
  • 62. 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 62
  • 64. 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 64
  • 65. Formulaires gestion de la soumission - exemple 65

Notes de l'éditeur

  1. 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
  2. LTS : Long-Term Support 3.4 est supportée jusqu’en nov 2020
  3. http://symfony.com/doc/current/reference/requirements.html Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  4. https://symfony.com/doc/current/setup.html https://getcomposer.org/download/
  5. composer create-project symfony/framework-standard-edition nomDuProjet pour la dernière version stable https://symfony.com/doc/current/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(); » 
  6. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  7. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  8. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  9. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  10. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  11. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  12. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  13. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  14. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  15. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  16. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  17. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  18. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  19. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  20. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  21. Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  22. https://symfony.com/doc/current/doctrine.html
  23. https://symfony.com/doc/current/doctrine.html
  24. https://symfony.com/doc/current/doctrine.html
  25. https://symfony.com/doc/current/doctrine.html
  26. https://symfony.com/doc/current/doctrine.html
  27. https://symfony.com/doc/current/doctrine.html
  28. https://symfony.com/doc/current/doctrine.html
  29. https://symfony.com/doc/current/doctrine.html
  30. https://symfony.com/doc/current/doctrine.html
  31. https://symfony.com/doc/current/doctrine.html
  32. https://symfony.com/doc/current/doctrine.html
  33. https://symfony.com/doc/current/doctrine.html