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

Introduction à Symfony

  • 1.
    Introduction à M. Abdoulaye DIENGFé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 enmain l’un des framework PHP les plus utilisés 2
  • 3.
    Objectifs opérationnels • Structurerles 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 cequ’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’unFramework ? • 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 queSymfony ? • 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 installerSymfony • 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 Symfonysous 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 Symfonysous 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 foisdans 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 Bundlede 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éfinitionen 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 Syntaxesd’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ètreoptionnel 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ètreoptionnel - 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éthodegenerateURL() 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; classDefaultController extends Controller{ /** * @Route("/",) */ public function indexAction() { return $this- >render(’HelloBundle:Default:index.html.twig'); } } 26
  • 27.
    Contrôleurs réception de contenuvia 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 contenuvia 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 contenuvia 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 contenuvia 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig 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 templateTwig exemple template parent HelloBundle/Ressources/views/layout.html.twig 43
  • 44.
    Moteur de templateTwig exemple template enfant HelloBundle/Ressources/views/Default/child.html.twig 44
  • 45.
    Moteur de templateTwig 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) Configureret 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éerla 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é Pourmodifier 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 nouvelobjet • 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 nouvelobjet - 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
  • 54.
  • 55.
    Entités modifier un objet Dansune 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
  • 56.
  • 57.
    Entités supprimer un objet Dansune 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 actiond’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
  • 61.
  • 62.
    Formulaires affichage • Afficher leformulaire 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
  • 63.
  • 64.
    Formulaires gestion de lasoumission 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 lasoumission - exemple 65

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/current/reference/requirements.html Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #10 https://symfony.com/doc/current/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/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(); » 
  • #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, … )
  • #37 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #38 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #39 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, … )
  • #44 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #45 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, … )
  • #48 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #49 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #50 Ctype : Vérification des types de caractères  (alpha, alphanum, ctrl, entier, imprimable, minus, maj, blanc, … )
  • #54  https://symfony.com/doc/current/doctrine.html
  • #55  https://symfony.com/doc/current/doctrine.html
  • #56 https://symfony.com/doc/current/doctrine.html
  • #57 https://symfony.com/doc/current/doctrine.html
  • #58  https://symfony.com/doc/current/doctrine.html
  • #60  https://symfony.com/doc/current/doctrine.html
  • #61  https://symfony.com/doc/current/doctrine.html
  • #62  https://symfony.com/doc/current/doctrine.html
  • #63  https://symfony.com/doc/current/doctrine.html
  • #64  https://symfony.com/doc/current/doctrine.html
  • #65  https://symfony.com/doc/current/doctrine.html
  • #66  https://symfony.com/doc/current/doctrine.html