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