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
5 Vues
1 Organisation
6 Routes
2 Rappels MVC
7 Git
3 Introdcution
8 Entity (model)
4 Symfony 3.x
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 : [Link]
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 Introdcution
Frameworks
Qu’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 ensemble
cohérent de composants logiciels structurels, qui sert à créer les fondations ainsi que les
grandes lignes de tout ou d’une partie d’un logiciel (architecture). Un framework se
distingue d’une simple bibliothèque logicielle principalement par :
son caractère générique, faiblement spécialisé, contrairement à certaines
bibliothèques ; un framework peut à ce titre être constitué de plusieurs
bibliothèques chacune spécialisée dans un domaine. Un framework peut néanmoins
être spécialisé, sur un langage particulier, une plateforme spécifique, un domaine
particulier : reporting, mapping, etc. ;
le cadre de travail (traduction littérale de l’anglais : framework) qu’il impose de par
sa construction même, guidant l’architecture logicielle voire conduisant le
développeur à respecter certains patterns ; les bibliothèques le constituant sont alors
organisé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 logiciels
applicatifs, des applications web, des middlewares et des composants logiciels. Les
frameworks sont acquis par les ingénieurs, puis incorporés dans des logiciels applicatifs
mis sur le marché, ils sont par conséquent rarement achetés et installés séparément par
un utilisateur final.
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é de
classes mères qui seront dérivées et étendues par héritage en fonction des besoins
spécifiques à chaque logiciel qui utilise le framework.
Avec un framework orienté objets, le programmeur qui utilise le framework pourra
personnaliser les éléments principaux du programme par extension, en utilisant le
mécanisme d’héritage : créer des nouvelles classes qui contiennent toutes les
fonctionnalités que met en place le framework, et en plus ses fonctionnalités propres,
créées par le programmeur en fonction des besoins spécifiques à son programme.
Le mécanisme d’héritage permet également de transformer des fonctionnalités
existant 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éfinies
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 et PHP 7, 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 qui
soutient et maintient Symfony : SensioLabs, dirigée par Fabien Potencier, l’auteur
de 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" (ou
bundles) afin de proposer un framework robuste, mais qui peut exploiter de nombreux
outils provenants de différentes sources.
Un bundle (ou composant) est une brique qui est indépendante du noyau symfony (mais
peut 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éfis de la version 3 sont multiples :
Optimisation des performances
Sécurité accrue
Compatibilité PHP 7
Simplification 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 que
toute application tournant sur une version 2.3 et plus, et sans aucune erreur de type
"deprecated" soit compatible avec Symfony 3.0 sans modifications 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 et
2.8...
La version 3.0 n’est pas non plus une LTS (Long Term Support).
La vraie différence entre la version 2.8 et la version 3.0 est la suppression définitive des
codes "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 versions
pré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 fichiers 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 la
version 3.x, il y a quand même pas mal de choses qui ont évolué dans la syntaxe et
l’organisation des fichiers.
Tout ce cours n’évoquera que la syntaxe de Symfony 3.3 / 3.4 (LTS) avec la nouvelle
organisation recommandée, les nouvelles syntaxes, méthodes, ... Vous trouverez toujours
disponible sur le site de Symfony la documentation des versions avant la 2.8, et sur les
forums tous les détails de ces précédentes versions.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 22 / 111
Sommaire
4 Symfony 3.x
Configuration nécessaire
Mon premier projet Symfony
Allez un peu plus loin dans l’installation
Comprendre la structure
Fonctionnement de Symfony
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 23 / 111
Configuration 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 Composer
[Link] qui se nomme "Symfony". Ce gestionnaire permet d’installer
tous les bundles nécessaire au bon fonctionnement de Symfony, et vous permettra de
maintenir à jour Symfony ou d’installer d’autres bundles.
Vous pouvez le télécharger depuis le site de symfony [Link] ou
l’utiliser en ligne de commande directement.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 24 / 111
Configuration 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 / bin
2 $ sudo curl - LsS https :// symfony . com / installer -o / usr / local / bin / symf
3 $ sudo chmod a + x / usr / local / bin / symfony
Installation de "Symfony Installer" sous windows, en vous placant dans votre repertoire
www par exemple
Listing 2 – Installation sous windows
1 $ php -r " file_put_contents ( ’ symfony ’ , ␣ file_get_contents ( ’ https :// sym
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 26 / 111
Installation de l’installer
Sous Linux et Mac une commande "symfony" a été ajouté. Sous Windows, vous devenir
définir 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 soit
l’OS.
En vous positionnant de le répertoire public_html ou www, exécutez la commande
suivante :
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échargement
peut prendre quelques minutes.
Cette commande vérifie également si votre système est correctement configuré pour
exé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’exécuter votre projet même si vous
n’avez pas de serveur web d’installé.
Pour cela il faut vous placer dans le répertoire de votre projet, puis exécuter :
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 :
[Link]
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’avoir
un serveur web d’installé et de configuré. Vous pouvez choisir NGinx ou Apache. Vous
trouverez les éléments sur ce lien
[Link]
Dans ce cas, l’URL de votre projet sera du type :
[Link]
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 30 / 111
Création d’un projet Symfony
La dernière étape consiste à configurer votre projet, pour cela rendez-vous sur l’URL
[Link] ou
[Link] 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ère
ré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 suffit 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 des
différents fichiers que nous allons écrire. Cependant, Symfony permet toutes les
organisations, dans la mesure ou le framework utilise les "Namespaces" afin d’associer
un fichier à un chemin.
Voici la structure recommandée
app/ : La configuration 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 fichiers générés par Symfony (cache, logs, ...). Il faut attribuer les droits
en écrire 755 ou 777 sur cache et logs
vendor/ : Les librairies tierces, c’est là aussi que se trouve tout le cœur de Symfony
et 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 fichiers des utilisateurs
(css, js, images, ...)
On trouve aussi dans ce répertoire les contrôleurs frontaux. Le contrôleur frontal est la
porte d’entrée dans Symfony. Tout passe forcément par lui. Son utilisation est
transparente pour le visiteur.
Il existe deux contrôleurs frontaux : [Link] et app_dev.php.
[Link] : C’est le contrôleur pour les visiteurs, pour un site en production. Il n’y a
pas de débuggage, mais des fichiers logs. Utilisation du cache et compilation des
fichiers CSS et JS.
app_dev.php : C’est le contrôleur pour les développeurs. Beaucoup d’outils d’aide
(profiler, ...), 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 fichiers des utilisateurs
(css, js, images, ...)
On trouve aussi dans ce répertoire les contrôleurs frontaux. Le contrôleur frontal est la
porte d’entrée dans Symfony. Tout passe forcément par lui. Son utilisation est
transparente pour le visiteur.
Il existe deux contrôleurs frontaux : [Link] et app_dev.php.
[Link] : C’est le contrôleur pour les visiteurs, pour un site en production. Il n’y a
pas de débuggage, mais des fichiers logs. Utilisation du cache et compilation des
fichiers CSS et JS.
app_dev.php : C’est le contrôleur pour les développeurs. Beaucoup d’outils d’aide
(profiler, ...), 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 ([Link]), les
configurations (*.yml) et les "Resources" (vues, traductions).
Le noyau est le second élément essentiel de Symfony, il permet de configurer les
bundles que l’on utilise. Normalement, on ne modifie jamais manuellement ce
fichier.
Par contre, on peut modifier les fichiers de configuration. Il y en a un par
"environnement" (soit dev soit prod par défaut). On peut donc avoir une
configuration différente selon les cas. Pratique pour les base de données par
exemple.
On trouve aussi le fichier de routage principal ([Link]), le fichier de sécurité
([Link]), la gestion des services ([Link]).
Enfin, un fichier [Link] qui contient les données de la base de données, du
serveur 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 on
parle 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écifique :
Le Kernel (cœur du framework, noyau en français)
Connaître son code n’est pas indispensable
Sachez qu’il envoi des évènements qu’il est possible d’écouter
Le service container
Indispensable
Il contient des service (comme son nom l’indique)
Il en existe des prédéfinis, 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 HTML
REQUEST (requête, demande) de la part du client (navigateur)
POST, GET, ...
Symfony traite la demande, construit la réponse et la retourne
RESPONSE
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
Sommaire
5 Vues
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 42 / 111
Twig, mon ami
Un template est en fait un fichier texte qui peut générer tous les formats basées sur du
texte (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 quelque
chose d’affichable (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 PHP
directement. (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’une
expression
{% ... %} "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 filtre (noté avec |). Qui permet de faire des manipulations
sur 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 filtre et de fonctions que vous pouvez
retrouver dans la documentation officielle : [Link]
Vous pouvez également créer vos propres filtres 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 à ne
jamais dupliquer du code, indique donc qu’il ne devrait y avoir qu’une seule fois la
structure du site web qu’on pourrait réutiliser autant que nécessaire.
C’est possible avec les templates et TWIG. Nous allons définir une base (on pourrait en
avoir plusieurs selon les contextes), et dans cette base définir des emplacements dans
lesquels nous pourrions venir mettre les éléments en fonction de la page choisie.
Dans TWIG cela s’appelle des block.
Reprennons le fichier [Link] par défaut.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 49 / 111
Héritage et block
Listing 10 – [Link]
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éfini le squelette du document HTML. Il ne devrait y avoir qu’une seule
fois ce type de code dans votre projet. Les block sont identifié avec les ligne {% block
nom %}. Le template définit 3 block : title, sidebar et body
C’est à dire qu’a chaque fois qu’on va utiliser ce template (en hérité) on pourra définir le
contenu de chacun de ces 3 block, sans modifier 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 "fils"
1 {# app / Resources / views / blog / index . html . twig #}
2 {% extends ’ base . html . twig ’ %}
3
4 {% block title %} My cool blog posts {% endblock %}
5
6 {% 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/fils du template [Link]. La ligne 2, permet
de définir que ce template "hérite" (extends) du template [Link]. 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éfinir tous les block présent dans le
parent, dans l’enfant. Ici pas de définition 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
Sommaire
6 Routes
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 55 / 111
Routes
Présentation des routes sur Symfony (et découverte de la documentation officielle) :
[Link]
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 56 / 111
Sommaire
7 Git
Utiliser 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éé par
Linus Torvalds, auteur du noyau Linux, et distribué selon les termes de la licence
publique générale GNU version 2. En 2016, il s’agit du logiciel de gestion de versions le
plus populaire qui est utilisé par plus de douze millions de personnes
GitHub, Mercurial, GitLab, Tower, ... Sont des interfaces web qui utilisent Git pour gérer
les 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 modifié le code
de travailler simultanément sur un même fichier sans risque
de suivre les modifications, ajouts, et suppressions
de savoir à quoi servent les fichiers
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
Configuration de GIT :
Listing 12 – Activier les couleurs dans la console
1 git config -- global color . diff auto
2 git config -- global color . status auto
3 git config -- global color . branch auto
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 61 / 111
Versionning avec GIT
Configuration de GIT :
Listing 13 – Configurer votre pseudo et email
1 git config -- global user . name " votre_pseudo "
2
3 git config -- global user . email moi@email . com
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 vous
trouvez. :) Un dossier caché .git vient tout simplement d’être créé.
Pour le moment le dossier est "configuré" pour GIT, mais il n’y a encore aucun fichier
de "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 fichiers sur des dépôts GIT public, vous pouvez
aussi récupérer des dépôts qui vous interessent ou sur lesquels vous aimeriez apporter
vos 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 en
clone). Vous n’aurez pas à vous rendre dans ce dossier caché en temps normal, sauf
éventuellement pour modifier le fichier de configuration .git/config qui se trouve à
l’intérieur.
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 65 / 111
Suivre les modifications
Listing 16 – Connaître les modificaitons
1 git status
Cette instruction indique les fichiers qui ont été modifié 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 modification peut être l’ajout d’une ligne, de 100 lignes, la création de fichiers, leur
suppression, ... Toute action sur le répertoire dans sa globalité.
Vous pouvez essayer de créer ou modifier des fichiers et vous rendre compte du
comportement de git en faisant :
Listing 17 – Connaître les modificaitons
1 git status
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 68 / 111
COMMIT
Vous devriez avoir une liste des modifications que vous avez effectuées
Listing 18 – Connaître les différences
1 git diff
Vous apportera le détail ligne par ligne des modifications. Vous pouvez indiquer un
fichier spécifique
Listing 19 – Connaître les diffé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 fichier qui ont subis des modifications. Cependant, GIT ne le sait
toujours pas. Il faut maintenant lui dire de mémoriser ces modifications.
Mais avant cela, il est nécessaire de préciser les fichiers sur lesquels vous souhaitez
surveiller les modifications. En effet, un fichier de log, par exemple, va subir de
nombreuses modifications, mais il n’y a pas d’intérêt à partager/sauvegarder un tel
fichier.
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 fichiers
1 git add nomfichier1 nomfichier2
2 git commit
La première ligne ajoute (add) les fichiers à "surveiller". La seconde ligne enregistre les
modifications dans GIT
Pour le vérifier faite :
Listing 21 – Connaître les différences
1 git status
Les fichiers 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 fichiers
1 git commit -a
Va commiter tous les fichiers 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 fichiers
1 git commit nomfichier1 nomfichier2
Va commiter tous les fichiers 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 fichiers que vous venez de créer
(juste la première fois) avec
Listing 24 – Ajouter des nouveaux fichiers
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 est
OBLIGATOIRE. Ce message est important car il doit préciser les modifications que
vous souhaitez sauvegarder. Soyez donc précis, tout en restant concis dans les
informations 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 est
stocké sur notre machine. Ce qui limite l’intérêt et ne permet donc pas une réelle
sauvegarde de notre travail, ni même un travail collaboratif.
Pour cela, il faut passer par un remote. On peut installer son propre remote assez
facilement 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 fichier [Link]
1 Pour cela il faut se rendre sur la solution choisie (GitHub par exemple) et créer
grâce à l’interface votre repository.
2 Remplissez les informations et laissez le fichier readme
3 Ensuite il faut cloner ce repository sur votre machine.
4 Puis déplacer votre projet dans ce nouveau répertoire
5 Ajouter les fichiers à suivre (git add)
6 Faire un COMMIT
7 Enfin 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 la
ligne 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 fichiers à suivre, et faire votre premier
COMMIT.
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 clone
fait 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 fichiers
Faites votre COMMIT
Faites votre PUSH
Vérifiez 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 aux
mê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étier
Une entity peut :
Être indépendante et permettre à votre application d’exécuter des actions du métier
(calculs financiers, ...)
Récupérer des informations depuis des webservices (météos, flux 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, et
4 méthodes.
Elle n’est pas liée à une base de
donné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 il
vous faut un ORM (object-relational mapping ) pour faire le lien entre la table et
votre 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 choisit
Elles définissent le lien entre un paramètre de votre classe et un champ de votre base
de données
Grâ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 de
votre base de données, et un objet PHP. Ce qui permet une manipulation plus aisée des
résultats d’une requête, mais aussi l’insertion ou la modification.
En fait, grâce à doctrine (ou un ORM) on manipule la base de données sans vraiment se
soucier des requêtes qui sont exécutées. Et cela devient intéressant si on doit changer de
serveur 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
Sou
[Link]
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 88 / 111
Utilisation de doctrine dans les entity
La documentation officielle de doctrine se trouve
[Link]
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 signifier à 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 classe
sera traduite en une table
Dans ce cas, une classe = une
table
Il est possible d’ajouter des
attributs et méthodes qui ne sont
pas 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 vous
souhaitez faire des modifications, 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 modifiez manuellement les attributs de votre classe (i.e. ajoutez des
champs ou des relations). Attention cette commande n’efface pas les getters et setters
qui 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ées
D’ajouter des getters et des setters pour répondre à votre logique métier
D’ajouter des méthodes.
N’oubliez jamais le constructeur ...
Par défaut il n’est pas présent, mais il peut être utilise pour
Initialiser 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 la
documentation officielle : [Link]
doctrine-orm/en/latest/reference/[Link]
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 96 / 111
Une fois nos entity définies, 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éfinies, que faire ?
Ensuite il faut mettre à jour la base de données en fonction des modifications
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 modification de vos entités
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 98 / 111
Une fois nos entity définies, que faire ?
Ensuite il faut mettre à jour la base de données en fonction des modifications
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’afficher les
requê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’affichage 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 différemment
pour exécuter les requêtes SQL
Listing 34 – Utilisation de Doctrine dans un controller
1 $doctrine = $this - > get ( ’ doctrine ’ );
2 ou
3 $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 le
Manager 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 effet sur la base de données.
ligne 13 : L’appel de la méthode flush(), Doctrine va regarder sur tous les objets de
son mapping s’il y a quelque chose à écrire ou modifier 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 une
requê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 );
6
7 if (! $product )
8 {
9 throw $this - > createNotFoundException (
10 ’ No ␣ product ␣ found ␣ for ␣ id ␣ ’. $productId
11 );
12 }
13 // do something , like pass the $product object into a template
14 }
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 un
SELECT), il faut toujours utiliser le "repository". Le repository dispose de plusieurs
méthodes qui facilitent la récupération de données dans une table. On va voir
ensuite, qu’il est possible de créer nos propres méthodes dans le repository pour des
requêtes plus spécifiques.
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 a
5 // column value
6 $product = $repository - > findOneById ( $productId );
7 $product = $repository - > findOneByName ( ’ Keyboard ’ );
8 // dynamic method names to find a group of products based on a
9 // column value
10 $products = $repository - > findByPrice (19.99);
11 // find * all * products
12 $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 ’
2
3 // query for a single product matching the given name and price
4 $product = $repository - > findOneBy (
5 array ( ’ name ’ = > ’ Keyboard ’ , ’ price ’ = > 19.99)
6 );
7
8 // query for multiple products matching the given name , ordered by pr
9 $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 );
6
7 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 modification d’un objet se déroule toujours en trois étapes :
Récupérer l’objet à modifier (Ligne 3 et 4).
Modifier 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 modification d’un objet se déroule toujours en trois étapes :
Récupérer l’objet à modifier (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
Sommaire
9 Formulaires
David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 111 / 111