M4D203D - POO Avancée
Découverte de Symfony
David Annebicque
IUT de Troyes
@DavidAnnebicque
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 1 / 111
Sommaire
1 Organisation
2 Rappels MVC
3 Introdcution
4 Symfony 3.x
5 Vues
6 Routes
7 Git
8 Entity (model)
9 Formulaires
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 2 / 111
Sommaire
1 Organisation
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 3 / 111
Objectifs
Objectifs du module :
Maîtriser les concepts avancés de la programmation orientée objet
Utiliser et appréhender les concepts d'un framework MVC
Prérequis :
Algorithmique
Programmation Orientée Objet
Base de données
Concepts MVC
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 4 / 111
Organisation
Organisation du module :
16 TP
Le projet S4
1 évaluation écrite (dernier TD)
1 note pratique
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 5 / 111
Organisation
Supports : http://davidannebicque.fr
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 6 / 111
Sommaire
2 Rappels MVC
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 7 / 111
Rappels MVC : Pattern Design
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 8 / 111
Sommaire
3 IntrodcutionFrameworksQu'est ce que Symfony
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 9 / 111
Qu'est ce qu'un framework ?
En programmation informatique, un framework ou structure logicielle est un ensemblecohérent de composants logiciels structurels, qui sert à créer les fondations ainsi que lesgrandes lignes de tout ou d'une partie d'un logiciel (architecture). Un framework sedistingue d'une simple bibliothèque logicielle principalement par :
son caractère générique, faiblement spécialisé, contrairement à certainesbibliothèques ; un framework peut à ce titre être constitué de plusieursbibliothèques chacune spécialisée dans un domaine. Un framework peut néanmoinsêtre spécialisé, sur un langage particulier, une plateforme spéci�que, un domaineparticulier : reporting, mapping, etc. ;
le cadre de travail (traduction littérale de l'anglais : framework) qu'il impose de parsa construction même, guidant l'architecture logicielle voire conduisant ledéveloppeur à respecter certains patterns ; les bibliothèques le constituant sont alorsorganisées selon le même paradigme.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 10 / 111
Qu'est ce qu'un framework ?
Les frameworks sont donc conçus et utilisés pour modeler l'architecture des logicielsapplicatifs, des applications web, des middlewares et des composants logiciels. Lesframeworks sont acquis par les ingénieurs, puis incorporés dans des logiciels applicatifsmis sur le marché, ils sont par conséquent rarement achetés et installés séparément parun utilisateur �nal.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 11 / 111
framework orienté objet
En programmation orientée objet, un framework est typiquement composé declasses mères qui seront dérivées et étendues par héritage en fonction des besoinsspéci�ques à chaque logiciel qui utilise le framework.
Avec un framework orienté objets, le programmeur qui utilise le framework pourrapersonnaliser les éléments principaux du programme par extension, en utilisant lemécanisme d'héritage : créer des nouvelles classes qui contiennent toutes lesfonctionnalités que met en place le framework, et en plus ses fonctionnalités propres,créées par le programmeur en fonction des besoins spéci�ques à son programme.
Le mécanisme d'héritage permet également de transformer des fonctionnalitésexistant dans les classes du framework.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 12 / 111
framework orienté objet
Avantages
Pour éviter des erreurs dans l'organisation des appelsÉviter les appels directs aux commandes PHP
Préférer les versions des Frameworks qui apportent leur lot de contrôles.Plus grand portabilité du code
Ne pas réinventer la roue
La gestion des formulaire, des utilisateurs, ...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 13 / 111
framework orienté objet
Inconvénients
Apprentissage d'une couche supplémentaire
La majorité des fonctionnalités PHP sont redé�nies
Généralement apprentissage d'un moteur de template
Apprentissage de l'utilisation du framework choisit
Ses classes, ses objets, sa logique !
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 14 / 111
Quelques frameworks PHP
Symfony (1er framework en europe)
Laravel (1er framework PHP aux USA)
Sylex (framework leger)
CodeIgniter
CakePHP
Zend
...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 15 / 111
Petite histoire d'un framework français
Framework MVC en PHP 5, libre
Développé en 2005 par la société Sensio pour répondre à ses besoins
Division de la société Sension en deux entités l'agence Web et l'entreprise quisoutient et maintient Symfony : SensioLabs, dirigée par Fabien Potencier, l'auteurde Symfony
Connectable à presque tous les SGBD
De nombreux Bundles, contributeurs, utilisateurs
Framework français !, De renommée mondiale
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 16 / 111
Structure de Symfony
Symfony se base sur un noyau qui permet de faire fonctionner divers "composants" (oubundles) a�n de proposer un framework robuste, mais qui peut exploiter de nombreuxoutils provenants de di�érentes sources.Un bundle (ou composant) est une brique qui est indépendante du noyau symfony (maispeut dépendre d'autres bundles) et qui répond à une problématique précise : Mail,Templates, Base de données, ...Symfony utilise dans sa version complète et fonctionnelle 46 bundles en plus du noyau !Nombre de ces bundles sont développés par SensioLabs.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 17 / 111
Structure de Symfony
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 18 / 111
De la version 2 à la version 3
Les dé�s de la version 3 sont multiples :
Optimisation des performances
Sécurité accrue
Compatibilité PHP 7
Simpli�cation d'utilisation
Pour cela SensioLabs à dès la vers 2.3 de Symfony commencé à mettre en place deséléments de la version 3.0 et indiquer aux développeurs les éléments qui allait disparaître.Cela s'est fait jusque la version 2.8, qui est en fait une pré-version 3.0. L'idée est quetoute application tournant sur une version 2.3 et plus, et sans aucune erreur de type"deprecated" soit compatible avec Symfony 3.0 sans modi�cations majeures du code.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 19 / 111
Quoi de neuf dans la version 3
Rien ! Puisque tous les éléments principaux ont été mis en place sur la version 2.7 et2.8...La version 3.0 n'est pas non plus une LTS (Long Term Support).La vraie di�érence entre la version 2.8 et la version 3.0 est la suppression dé�nitive descodes "deprecated".Dans sa version 3.0, Symfony requière PHP 5.5.9 au minimum, et est compatible PHP 7.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 20 / 111
Symfony 2.8 a.k. 3.0
Symfony 2.8 a intégré plus de 100 nouveautés/améliorations par rapport aux versionsprécédentes. En voici quelques-unes
Nouvel installeur, Console redesigné pour plus de lisibilité
Support de LDAP
Web prodiler redesigné
Nouvelle structure de repertoire (même si l'ancienne reste possible)
Suppression de assetic et de la gestion "web" des �chiers css/js/images
Optimisation de Twig, YAML, ...
Optimisation des tests, ...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 21 / 111
Symfony 2.8 a.k. 3.0
Même si tout a été fait pour assurer la compatibilité entre les versions avant 2.8 et laversion 3.x, il y a quand même pas mal de choses qui ont évolué dans la syntaxe etl'organisation des �chiers.Tout ce cours n'évoquera que la syntaxe de Symfony 3.x avec la nouvelle organisationrecommandée, les nouvelles syntaxes, méthodes, ... Vous trouverez toujours disponiblesur le site de Symfony la documentation des versions avant la 2.8, et sur les forums tousles détails de ces précédentes versions.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 22 / 111
Sommaire
4 Symfony 3.xCon�guration nécessaireMon premier projet SymfonyAllez un peu plus loin dans l'installationComprendre la structureFonctionnement de Symfony
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 23 / 111
Con�guration nécessaire
Symfony fonctionne sur tous les types de serveurs (windows, linux, ou mac).Evidemment la solution linux est la plus pratique et simple d'utilisation !Pour installer Symfony, il est un gestionnaire de dépendance basé sur Composerhttp://getcomposer.com, qui se nomme "Symfony". Ce gestionnaire permet d'installertous les bundles nécessaire au bon fonctionnement de Symfony, et vous permettra demaintenir à jour Symfony ou d'installer d'autres bundles.Vous pouvez le télécharger depuis le site de symfony http://www.symfony.com, oul'utiliser en ligne de commande directement.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 24 / 111
Con�guration nécessaire
Vous aurez aussi besoin des éléments suivants :
Un serveur web (nginx ou apache)
PHP (5.5.9 minimum)
Une base de données
Git (nous y reviendrons)
Un IDE PHP (PhpStorm par exemple)
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 25 / 111
Installation de l'installer
Installation de "Symfony Installer" sous linux ou mac
Listing 1 � Installation sous Linux et Mac
1 $ sudo mkdir -p /usr/local/bin2 $ sudo curl -LsS https :// symfony.com/installer -o /usr/local/bin/symfony3 $ sudo chmod a+x /usr/local/bin/symfony
Installation de "Symfony Installer" sous windows, en vous placant dans votre repertoirewww par exemple
Listing 2 � Installation sous windows
1 $ php -r "file_put_contents(’symfony ’,␣file_get_contents(’https :// symfony.com/installer ’));"
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 26 / 111
Installation de l'installer
Sous Linux et Mac une commade "symfony" a été ajouté. Sous Windows, vous devenirdé�nir la variable d'environnement PATH avec le chemin vers le repertoire contenant le"Symfony Installer" ou alors vous pouvez utiliser :
Listing 3 � Utilisation sous windows
1 $ php symfony.phar
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 27 / 111
Création d'un projet Symfony
Sauf mentions contraires, toutes les commandes qui suivent fonctionnes quelque soitl'OS.En vous positionnant de le repertoire public_html ou www, executez la commandesuivante :
Listing 4 � Nouveau Projet Symfony
1 $ symfony new my_project_name
Cette commande va installer Symfony et les dépendances nécessaires. Le téléchargementpeut prendre quelques minutes.Cette commande véri�e également si votre système est correctement con�guré pourexécuter Symfony.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 28 / 111
Création d'un projet Symfony
Symfony embarque un serveur web qui permet d'executer votre projet même si vousn'avez pas de serveur web d'installé.Pour cela il faut vous placer dans le repertoire de votre projet, puis executer :
Listing 5 � Executer le server web de Symfony
1 php bin/console server:run
Tout en laissant cette console ouverte, rendez-vous à l'URL suivante :http://localhost:8000/Vous devriez vois une page indiquant la version de Symfony.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 29 / 111
Création d'un projet Symfony
Quel serveur utiliser
Cette solution est rapide pour tester un petit script. Il est néanmoins préférable d'avoirun serveur web d'installé et de con�guré. Vous pouvez choisir Nginx ou Apache. Voustrouverez les éléments sur ce lienhttp://symfony.com/doc/current/setup/web_server_configuration.html.
Dans ce cas, l'URL de votre projet sera du type :http://localhost/my_project_name/web/app_dev.php/
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 30 / 111
Création d'un projet Symfony
La dernière étape consiste à con�gurer votre projet, pour cela rendez-vous sur l'URLhttp://localhost:8000/config.php ouhttp://localhost/my_project_name/web/config.php et remplissez le formulaire.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 31 / 111
Maintenir à jour son projet Symfony
Symfony est dépendant de nombreux bundles qui peuvent être mis à jour de manièrerégulière. Symfony lui même aura régulièrement des mises à jours. Ces mises à jour sontà faire de manière régulière. Pour cela, c'est très simple il su�t de lancer la commande
Listing 6 � Update Symfony
1 composer update
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 32 / 111
Architecture de Symfony
Symfony utilise de nombreux repertoire et propose une logique d'organisation desdi�érents �chiers que nous allons écrire. Cependant, Symfony permet toutes lesorganisations, dans la mesure ou le framework utilise les "Namespaces" a�n d'associerun �chier à un chemin.Voici la structure recommandée
app/ : La con�guration de votre application, mais aussi l'emplacement des vues(template) et des traductions
bin/ : Les exécutables, notamment la console
tests/ : pour les tests fonctionnels que l'on pourrait écrire
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 33 / 111
Architecture de Symfony
var/ : Les �chiers générés par Symfony (cache, logs, ...). Il faut attribuer les droitsen écrire 755 ou 777 sur cache et logs
vendor/ : Les librairies tierces, c'est là aussi que se trouve tout le c÷ur de Symfonyet les bundles
web/ : Le répertoire principal, le "root".
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 34 / 111
Le répertoire web
C'est dans ce répertoire que se trouve l'accès à Symfony et les �chiers des utilisateurs(css, js, images, ...)On trouve aussi dans ce répertoire les contrôleurs frontaux. Le contrôleur frontal est laporte d'entrée dans Symfony. Tout passe forcément par lui. Son utilisation esttransparente pour le visiteur.Il existe deux contrôleurs frontaux : app.php et app_dev.php.
app.php : C'est le contrôleur pour les visiteurs, pour un site en production. Il n'y apas de débuggage, mais des �chiers logs. Utilisation du cache et compilation des�chiers CSS et JS.
app_dev.php : C'est le contrôleur pour les développeurs. Beaucoup d'outils d'aide(pro�ler, ...), pas d'utilisation du cache
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 35 / 111
Le répertoire web
C'est dans ce répertoire que se trouve l'accès à Symfony et les �chiers des utilisateurs(css, js, images, ...)On trouve aussi dans ce répertoire les contrôleurs frontaux. Le contrôleur frontal est laporte d'entrée dans Symfony. Tout passe forcément par lui. Son utilisation esttransparente pour le visiteur.Il existe deux contrôleurs frontaux : app.php et app_dev.php.
app.php : C'est le contrôleur pour les visiteurs, pour un site en production. Il n'y apas de débuggage, mais des �chiers logs. Utilisation du cache et compilation des�chiers CSS et JS.
app_dev.php : C'est le contrôleur pour les développeurs. Beaucoup d'outils d'aide(pro�ler, ...), pas d'utilisation du cache
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 36 / 111
Le répertoire app
C'est dans ce répertoire que l'on trouve le noyau (AppKernel.php), lescon�gurations (*.yml) et les "Resources" (vues, traductions).
Le noyau est le second élément essentiel de Symfony, il permet de con�gurer lesbundles que l'on utilise. Normalement, on ne modi�e jamais manuellement ce�chier.
Par contre, on peut modi�er les �chiers de con�guration. Il y en a un par"environnement" (soit dev soit prod par défaut). On peut donc avoir unecon�guration di�érente selon les cas. Pratique pour les base de données parexemple.
On trouve aussi le �chier de routage principal (routing.yml), le �chier de sécurité(security.yml), la gestion des services (services.yml).
En�n, un �chier parameters.yml qui contient les données de la base de données, duserveur de mail, ...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 37 / 111
Notion de Bundle
C'est l'élément le plus puissant de Symfony
Un bundle peut être vu comme un plugin dans un logiciel ou un CMS. Mais onparle de bundle, car dans Symfony tout est bundle. Le noyau est un bundle,l'installation de Symfony est l'utilisation de plusieurs bundle
Tout le code que vous allez écrire va constituer un bundle avec ses images, son css,son javascript, ...
Un bundle est conçu pour être réutilisé dans d'autres projets.
Il existe plus de 2000 bundles mis à disposition par la communauté.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 38 / 111
Fonctionnement de Symfony
Outre le concept MVC, Symfony utilise deux composants essentiels et spéci�que :Le Kernel (c÷ur du framework, noyau en français)
Connaître son code n'est pas indispensableSachez qu'il envoi des évènements qu'il est possible d'écouter
Le service containerIndispensableIl contient des service (comme son nom l'indique)Il en existe des prédé�nis, nous en créerons des personnels
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 39 / 111
Fonctionnement de Symfony
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 40 / 111
Fonctionnement de Symfony
Symfony exploite les fondements du protocole HTMLREQUEST (requête, demande) de la part du client (navigateur)
POST, GET, ...
Symfony traite la demande, construit la réponse et la retourneRESPONSE
Contient un code (200 OK, 404 erreur, ...)Et un contenu (JSON, HTML, CSV, PDF, ...)
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 41 / 111
Twig, mon ami
Un template est en fait un �chier texte qui peut générer tous les formats basées sur dutexte (HTML, XML, CSV, JSON, LaTeX, ...).Généralement on utilise des templates "PHP", c'est à dire mêlant du code texte(souvent HTML) et du PHP. Ensuite tout cela est interprété, et traduit en quelquechose d'a�chable (souvent du HTML).Cette solution est pratique et rapide à mettre en place, mais syntaxiquement lourde àécrire, et souvent rejetée par les intégrateurs qui n'aiment pas écrire du PHP.Nombreux frameworks utilisent donc des moteurs de template ne se basant pas sur PHPdirectement. (en réalité, tout le code sera traduit en PHP ? puis en HTML ensuite).
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 43 / 111
Twig, mon ami
Listing 7 � PHP-Template
1 ...2 <body >3 <h1 ><?php echo $page_title ?></h1>4 <ul id="navigation">5 <?php foreach ($navigation as $item): ?>6 <li>7 <a href="<?php␣echo␣$item ->getHref ()␣?>">8 <?php echo $item ->getCaption () ?>9 </a>
10 </li>11 <?php endforeach ?>12 </ul>
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 44 / 111
Twig, mon ami
Listing 8 � TWIG-Template
1 <!DOCTYPE html >2 <html >3 <head >4 <title >Welcome to Symfony!</title >5 </head >6 <body >7 <h1 >{{ page_title }}</h1>8 <ul id="navigation">9 {% for item in navigation %}
10 <li><a href="{{␣item.href␣}}" >{{ item.caption }}</a></li>11 {% endfor %}12 </ul>13 </body >14 </html >
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 45 / 111
Syntaxe de twig
Twig utilise 3 notations :
{{ ... }} "Dit quelque chose" : permet d'écrire une variable ou le résultat d'uneexpression
{% ... %} "Fait quelque chose" : permet de contrôler la logique du template.Permet l'exécution de fonctionnalités comme les boucles ou les tests.
{# ... #} "Commente quelque chose" : Permet d'écrire un commentaire.
Twig utilise aussi la notion de �ltre (noté avec |). Qui permet de faire des manipulationssur les variables.
Listing 9 � Filtre
1 {{ title|upper }}
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 46 / 111
Syntaxe de twig
Twig intègre une très longue liste de tags, de �ltre et de fonctions que vous pouvezretrouver dans la documentation o�cielle : http://twig.sensiolabs.org.Vous pouvez également créer vos propres �ltres ou fonctions.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 47 / 111
Syntaxe de twig
Twig intégre également les structures de contrôles classiques
{% if ... %} ... {% elseif ... %} ... {% else %} ... {% endif %}
{% for ... in ... [if ... ] %} ... {% else %} {% endfor %}
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 48 / 111
Héritage et block
Il est fréquent dans un projet d'avoir des éléments communs à chacune des pages(header, menu, footer, ...). La logique de SYmfony et d'un framework qui consiste à nejamais dupliquer du code, indique donc qu'il ne devrait y avoir qu'une seule fois lastructure du site web qu'on pourrait réutiliser autant que nécessaire.C'est possible avec les templates et TWIG. Nous allons dé�nir une base (on pourrait enavoir plusieurs selon les contextes), et dans cette base dé�nir des emplacements danslesquels nous pourrions venir mettre les éléments en fonction de la page choisie.Dans TWIG cela s'appelle des block.Reprennons le �chier base.html.twig par défaut.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 49 / 111
Héritage et block
Listing 10 � base.html.twig
1 ...2 <head >3 <title >{% block title %}Test Application {% endblock %}</title >4 </head >5 <body >6 <div id="sidebar">7 {% block sidebar %}8 <ul><li >...</li ></ul >9 {% endblock %}
10 </div >11 <div id="content">12 {% block body %}{% endblock %}13 </div >14 ...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 50 / 111
Héritage et block
Ce template dé�ni le squelette du document HTML. Il ne devrait y avoir qu'une seulefois ce type de code dans votre projet. Les block sont identi�é avec les ligne {% blocknom %}. Le template dé�nit 3 block : title, sidebar et bodyC'est à dire qu'a chaque fois qu'on va utiliser ce template (en hérité) on pourra dé�nir lecontenu de chacun de ces 3 block, sans modi�er le reste de la structure.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 51 / 111
Héritage et block
Listing 11 � Exemple d'un template "�ls"
1 {# app/Resources/views/blog/index.html.twig #}2 {% extends ’base.html.twig’ %}34 {% block title %}My cool blog posts{% endblock %}56 {% block body %}7 {% for entry in blog_entries %}8 <h2 >{{ entry.title }}</h2>9 <p>{{ entry.body }}</p>
10 {% endfor %}11 {% endblock %}
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 52 / 111
Héritage et block
Ce template est un template enfant/�ls du template base.html.twig. La ligne 2, permetde dé�nir que ce template "hérite" (extends) du template base.html.twig. C'est grâce àcette ligne que l'on peut écrire dans les block existant.Comme vous le constatez il n'est pas nécessaire de dé�nir tous les block présent dans leparent, dans l'enfant. Ici pas de dé�nition du block sidebar.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 53 / 111
Manipulation des variables
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 54 / 111
Routes
Présentation des routes sur Symfony (et découverte de la documentation o�cielle) :http://symfony.com/doc/current/routing.html
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 56 / 111
Sommaire
7 GitUtiliser les Remotes
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 57 / 111
Versionning avec GIT
git est un logiciel de gestion de versions décentralisé. C'est un logiciel libre créé parLinus Torvalds, auteur du noyau Linux, et distribué selon les termes de la licencepublique générale GNU version 2. En 2016, il s'agit du logiciel de gestion de versions leplus populaire qui est utilisé par plus de douze millions de personnes
GitHub, Mercurial, GitLab, Tower, ... Sont des interfaces web qui utilisent Git pour gérerles versions. On parle de "remote".
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 58 / 111
Versionning avec GIT
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 59 / 111
Versionning avec GIT
Git permet :
De savoir qui a modi�é le code
de travailler simultanément sur un même �chier sans risque
de suivre les modi�cations, ajouts, et suppressions
de savoir à quoi servent les �chiers
de suivre les mises à jours en fonction des bugs déclarés
Simplement de faire une sauvegarde de son projet
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 60 / 111
Versionning avec GIT
Con�guration de GIT :
Listing 12 � Activier les couleurs dans la console
1 git config --global color.diff auto2 git config --global color.status auto3 git config --global color.branch auto
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 61 / 111
Versionning avec GIT
Con�guration de GIT :
Listing 13 � Con�gurer votre pseudo et email
1 git config --global user.name "votre_pseudo"23 git config --global user.email [email protected]
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 62 / 111
Créer un nouveau dépôt
Vous positionner dans le répertoire de votre projet
Listing 14 � Initialiser votre dépôt
1 git init
C'est tout ! Vous venez de créer un nouveau projet Git dans le dossier où vous voustrouvez. :) Un dossier caché .git vient tout simplement d'être créé.Pour le moment le dossier est "con�guré" pour GIT, mais il n'y a encore aucun �chierde "surveillé" par GIT.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 63 / 111
Cloner un dépôt
Tout comme vous pouvez partager des �chiers sur des dépôts GIT public, vous pouvezaussi récupérer des dépôts qui vous interessent ou sur lesquels vous aimeriez apportervos contributions.Pour cela, il faut vous rendre sur le dépôt concerné en passant par GITHub par exemple.Vous trouverez généralement la ligne à utiliser.
Listing 15 � Cloner un dépôt
1 git clone http :// github.com/symfony/symfony.git
Vous permet de cloner le dépôt de Symfony. (ce n'est pas une installation de Symfony !)
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 64 / 111
Le dossier .git
Git crée un dossier .git caché à la racine du dossier de votre projet (en création ou enclone). Vous n'aurez pas à vous rendre dans ce dossier caché en temps normal, sauféventuellement pour modi�er le �chier de con�guration .git/con�g qui se trouve àl'intérieur.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 65 / 111
Suivre les modi�cations
Listing 16 � Connaître les modi�caitons
1 git status
Cette instruction indique les �chiers qui ont été modi�é récemment
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 66 / 111
Processus d'utilisation de GIT
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 67 / 111
COMMIT
Une modi�cation peut être l'ajout d'une ligne, de 100 lignes, la création de �chiers, leursuppression, ... Toute action sur le répertoire dans sa globalité.Vous pouvez essayer de créer ou modi�er des �chiers et vous rendre compte ducomportement de git en faisant :
Listing 17 � Connaître les modi�caitons
1 git status
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 68 / 111
COMMIT
Vous devriez avoir une liste des modi�cations que vous avez e�ectuées
Listing 18 � Connaître les di�érences
1 git diff
Vous apportera le détail ligne par ligne des modi�cations. Vous pouvez indiquer un�chier spéci�que
Listing 19 � Connaître les di�érences
1 git diff chemin/vers/votre/fichier
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 69 / 111
COMMIT
Vous avez une liste de �chier qui ont subis des modi�cations. Cependant, GIT ne le saittoujours pas. Il faut maintenant lui dire de mémoriser ces modi�cations.Mais avant cela, il est nécessaire de préciser les �chiers sur lesquels vous souhaitezsurveiller les modi�cations. En e�et, un �chier de log, par exemple, va subir denombreuses modi�cations, mais il n'y a pas d'intérêt à partager/sauvegarder un tel�chier.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 70 / 111
COMMIT - Méthode 1
Méthode 1 :
Listing 20 � Ajouter et Commiter des �chiers
1 git add nomfichier1 nomfichier22 git commit
La première ligne ajoute (add) les �chiers à "surveiller". La seconde ligne enregistre lesmodi�cations dans GITPour le véri�er faite :
Listing 21 � Connaître les di�érences
1 git status
Les �chiers que vous avez ajoutés doivent apparaître en vert.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 71 / 111
COMMIT - Méthode 2
Méthode 2 :
Listing 22 � Ajouter et Commiter des �chiers
1 git commit -a
Va commiter tous les �chiers présents dans un git status.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 72 / 111
COMMIT - Méthode 3
Méthode 3 :
Listing 23 � Ajouter et Commiter des �chiers
1 git commit nomfichier1 nomfichier2
Va commiter tous les �chiers listés.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 73 / 111
COMMIT
Il est dans tous les cas nécessaire de préciser à GIT les �chiers que vous venez de créer(juste la première fois) avec
Listing 24 � Ajouter des nouveaux �chiers
1 git add fichiers
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 74 / 111
COMMIT
Lors d'un COMMIT, la console va vous demander de saisir du texte. Cette étape estOBLIGATOIRE. Ce message est important car il doit préciser les modi�cations quevous souhaitez sauvegarder. Soyez donc précis, tout en restant concis dans lesinformations transmises.On peut aussi écrire :
Listing 25 � Commit avec un message
1 git commit -m "mon␣message"
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 75 / 111
Remote
On vient de voir l'intérêt d'utiliser Git. Mais pour le moment tout le suivi de version eststocké sur notre machine. Ce qui limite l'intérêt et ne permet donc pas une réellesauvegarde de notre travail, ni même un travail collaboratif.Pour cela, il faut passer par un remote. On peut installer son propre remote assezfacilement sur un serveur, ou utiliser une solution existante : GitHub, GitLab, BitBucket,Mercurial, ...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 76 / 111
Créer son repository
Laissez par défaut le �chier read.me
1 Pour cela il faut se rendre sur la solution choisie (GitHub par exemple) et créergrâce à l'interface votre repository.
2 Remplissez les informations et laissez le �chier readme3 Ensuite il faut cloner ce repository sur votre machine.4 Puis déplacer votre projet dans ce nouveau répertoire5 Ajouter les �chiers à suivre (git add)6 Faire un COMMIT7 En�n envoyer les éléments sur le dépôt GitHub
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 77 / 111
Cloner un repository
Listing 26 � Cloner un repository
1 git clone lienFourniParGitHub
GitHub propose un lien HTTPS ou SSH pour chaque repository. Vous avez même laligne complète de disponible à copier/coller directement dans votre console.Une fois cloné, copier/coller votre projet dans ce repertoire. Il est maintenant associé àun remote. Vous devez dire quels sont les �chiers à suivre, et faire votre premierCOMMIT.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 78 / 111
Envoyer votre code vers un repository
Listing 27 � Envoyer votre code vers un repository
1 git push origin master
Origin designe le remote par défaut sur lequel sera envoyé le code. Il correspond au clonefait précédemment. Master représente la "Branch" sur laquelle le code est envoyé.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 79 / 111
Récupérer votre code depuis un repository
Listing 28 � Récupérer votre code depuis un repository
1 git pull origin master
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 80 / 111
A vous de jouer
Créez votre dépôt/repository
Clonez le
Déplacez votre projet dans le nouveau répertoire
Ajoutez les �chiers
Faites votre COMMIT
Faites votre PUSH
Véri�ez sur le web votre travail.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 81 / 111
Sommaire
8 Entity (model)Une entité est une classe
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 82 / 111
Une entité est une classe
Une entité est une classe
Au sens premier du terme, une entité est une classe PHP, qui répond exactement auxmêmes possibilités que celles vues en S3.
Une entity n'est pas forcément une table dans votre base de données
Une entity représente une logique métierUne entity peut :
Être indépendante et permettre à votre application d'exécuter des actions du métier(calculs �nanciers, ...)Récupérer des informations depuis des webservices (météos, �ux twitter, ...)Manipuler des tables de votre base de données
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 83 / 111
Une entité est une classe
Exemple d'une entité.
Cette entité possède 2 attributs, et4 méthodes.
Elle n'est pas liée à une base dedonnées.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 84 / 111
Utilisation de l'entité dans un controller.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 85 / 111
Entité et Base de données
Si votre entity est une transposition d'une table de votre base de données alors ilvous faut un ORM (object-relational mapping) pour faire le lien entre la table etvotre classe PHP
Dans Symfony le plus courant est doctrine (mais il existe Propel, ...)Dans ce cas votre entity doit posséder des commentaires ...
En fait des annotations...Elles sont propres à l'ORM choisitElles dé�nissent le lien entre un paramètre de votre classe et un champ de votre basede donnéesGrâce à ce système de description vous ne devriez jamais aller dans "PhpMyAdmin"pour créer des tables !
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 86 / 111
Entité et Base de données
Doctrine permet donc de faire un "mapping" entre les éléments de votre table, issus devotre base de données, et un objet PHP. Ce qui permet une manipulation plus aisée desrésultats d'une requête, mais aussi l'insertion ou la modi�cation.En fait, grâce à doctrine (ou un ORM) on manipule la base de données sans vraiment sesoucier des requêtes qui sont exécutées. Et cela devient intéressant si on doit changer deserveur de base de données. Il n'est pas nécessaire de réécrire le code !
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 87 / 111
Entité et Base de données
Source :sym-fony.com
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 88 / 111
Utilisation de doctrine dans les entity
La documentation o�cielle de doctrine se trouvehttp://www.doctrine-project.org/
vous pourriez utiliser doctrine dans d'autres contexte qu'avec Symfony.
Si vous souhaitez utiliser Doctrine avec une de vos entités, c'est à dire lier le modelà une table, il faut ajouter :
1 use Doctrine\ORM\Mapping as ORM;
Pour signi�er à Symfony que vous voulez utiliser doctrine comme ORM.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 89 / 111
Utilisation de doctrine dans les entity
Exemple d'une entité avec Doctrine.
Les annotations permettent"d'expliquer" comme cette classesera traduite en une table
Dans ce cas, une classe = unetable
Il est possible d'ajouter desattributs et méthodes qui ne sontpas liées à la table.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 90 / 111
Les bases de données et Doctrine
Mais...
Mais en fait, vous n'avez rien à écrire dans la majorité des cas. Bien sûr si voussouhaitez faire des modi�cations, il faut comprendre et parfois écrire ces annotations.Mais pour créer une table, on va utiliser la console ...
Démonstration de la console et de la création d'une table.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 91 / 111
Quelques commandes
Listing 29 � Créer une entité
1 php bin/console doctrine:generate:entity
Cette ligne permet de créer une nouvelle entité liée à une table de votre base de données.
Listing 30 � Mettre à jour une entité
1 php bin/console doctrine:generate:entities AppBundle:MonEntity
Cette ligne va permettre d'actualiser les getters et setters, mais aussi les relations,lorsque vous modi�ez manuellement les attributs de votre classe (i.e. ajoutez deschamps ou des relations). Attention cette commande n'e�ace pas les getters et settersqui ne sont plus nécessaires.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 92 / 111
Une entité est une classe...
Vous êtes bien sûr libre :D'ajouter des paramètres qui ne seront pas persistés en base de donnéesD'ajouter des getters et des setters pour répondre à votre logique métierD'ajouter des méthodes.
N'oubliez jamais le constructeur ...Par défaut il n'est pas présent, mais il peut être utilise pourInitialiser des paramètres (champs ?)Pour pré-remplir en fonction d'un paramètre d'autres champs,...
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 93 / 111
Les formats de Doctrine
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 94 / 111
Les options de Doctrine
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 95 / 111
Les options de Doctrine
Toutes les possibilités des annotations et du mapping avec doctrine se trouvent sur ladocumentation o�cielle : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 96 / 111
Une fois nos entity dé�nies, que faire ?
Encore une fois Symfony va s'occuper de tout !
La première fois il faut créer la base de données
Listing 31 � Création de la base de données
1 php bin/console doctrine:database:create
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 97 / 111
Une fois nos entity dé�nies, que faire ?
Ensuite il faut mettre à jour la base de données en fonction des modi�cations
Listing 32 � Mise à jour de la base de données
1 php bin/console doctrine:schema:update --force
Attention
Il faut exécuter cette commande après chaque modi�cation de vos entités
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 98 / 111
Une fois nos entity dé�nies, que faire ?
Ensuite il faut mettre à jour la base de données en fonction des modi�cations
Listing 33 � Voir le code MySQL executé
1 php bin/console doctrine:schema:update --dump -sql
Attention
Cette commande ne met pas à jour la base de données. Elle permet juste d'a�cher lesrequêtes qui seront exécutées. Cette ligne doit être exécutée en même temps qu'un�force ou avant. Mais une fois le �force réalisé, il n'y a plus d'a�chage possible.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 99 / 111
Manipuler les entités
On a déjà vu comment faire quand une entity ne dépend pas d'une base de données
Mais si cette entity est associée à un ORM, il faut procéder un peu di�éremmentpour exécuter les requêtes SQL
Listing 34 � Utilisation de Doctrine dans un controller
1 $doctrine=$this ->get(’doctrine ’);2 ou3 $doctrine=$this ->getDoctrine ();
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 100 / 111
Persister des objets dans la base de données
Listing 35 � Exemple de controller
1 use AppBundle\Entity\Product;2 ...3 public function createAction ()4 {5 $product = new Product ();6 $product ->setName(’Keyboard ’);7 $product ->setPrice (19.99);8 $product ->setDescription(’Ergonomic␣and␣stylish!’);9
10 $em = $this ->getDoctrine()->getManager ();11 $em ->persist($product );12 $em ->flush ();13 ...14 }
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 101 / 111
Persister des objets dans la base de données
Explication du code précédent :
Ligne 6 à 9 : On instancie un nouvel objet, et on lui donne des données.
Ligne 11 : On récupère un "manager". Ici, un manager associé à Doctrine. C'est leManager qui contient une connexion à la base de données
Ligne 12 : Cette ligne permet juste de dire à doctrine ($em) de s'occuper (manager)l'instance de l'objet $product. Cette ligne n'a aucun e�et sur la base de données.
ligne 13 : L'appel de la méthode �ush(), Doctrine va regarder sur tous les objets deson mapping s'il y a quelque chose à écrire ou modi�er dans la base de données.Dans cet exemple l'objet $product n'existe pas encore dans la base de données.Donc l'entity manager va insérer l'objet dans la table product, il va exécuter unerequête INSERT.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 102 / 111
Récupérer des objets dans la base de données
Listing 36 � Exemple de controller
1 public function showAction($productId)2 {3 $product = $this ->getDoctrine ()4 ->getRepository(’AppBundle:Product ’)5 ->find($productId );67 if (! $product)8 {9 throw $this ->createNotFoundException(
10 ’No␣product␣found␣for␣id␣’.$productId11 );12 }13 //do something , like pass the $product object into a template14 }
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 103 / 111
Persister des objets dans la base de données
Explication du code précédent :
3 à 5 : Pour récupérer des données depuis une base de données (exécuter unSELECT), il faut toujours utiliser le "repository". Le repository dispose de plusieursméthodes qui facilitent la récupération de données dans une table. On va voirensuite, qu'il est possible de créer nos propres méthodes dans le repository pour desrequêtes plus spéci�ques.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 104 / 111
Exemple de méthodes dans le repository
Listing 37 � Exemple de repository
1 $repository = $this ->getDoctrine()->getRepository(’AppBundle:Product ’);2 // query for a single product by its primary key (usually "id")3 $product = $repository ->find($productId );4 // dynamic method names to find a single product based on a5 // column value6 $product = $repository ->findOneById($productId );7 $product = $repository ->findOneByName(’Keyboard ’);8 // dynamic method names to find a group of products based on a9 // column value
10 $products = $repository ->findByPrice (19.99);11 // find *all* products12 $products = $repository ->findAll ();
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 105 / 111
Exemple de méthodes dans le repository
Listing 38 � Exemple de controller
1 $repository = $this ->getDoctrine()->getRepository(’AppBundle:Product ’);23 // query for a single product matching the given name and price4 $product = $repository ->findOneBy(5 array(’name’ => ’Keyboard ’, ’price’ => 19.99)6 );78 // query for multiple products matching the given name , ordered by price9 $products = $repository ->findBy(
10 array(’name’ => ’Keyboard ’),11 array(’price’ => ’ASC’)12 );s
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 106 / 111
Mise à jour d'un objet
Listing 39 � Exemple de controller
1 public function updateAction($productId)2 {3 $em = $this ->getDoctrine()->getManager ();4 $product = $em ->getRepository(’AppBundle:Product ’)5 ->find($productId );67 if (! $product) {8 throw $this ->createNotFoundException(9 ’No␣product␣found␣for␣id␣’.$productId );
10 }11 $product ->setName(’New␣product␣name!’);12 $em ->flush ();13 ...14 }
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 107 / 111
Mise à jour d'un objet
La modi�cation d'un objet se déroule toujours en trois étapes :
Récupérer l'objet à modi�er (Ligne 3 et 4).
Modi�er l'objet (ligne 11)
Mettre à jour la base de données (ligne 12)
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 108 / 111
Suppression d'un objet
Listing 40 � Exemple de controller
1 $em = $this ->getDoctrine()->getManager ();2 $em ->remove($product );3 $em ->flush ();
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 109 / 111
Suppression d'un objet
La modi�cation d'un objet se déroule toujours en trois étapes :
Récupérer l'objet à modi�er (non présent ici).
Supprimer l'objet (ligne 2)
Mettre à jour la base de données (ligne 3)
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 110 / 111