111

M4D203D - POO Avancée - Découverte de Symfonydavidannebicque.fr/wp-content/uploads/2016/09/main-1.pdf · M4D203D - POO Avancée Découverte de Symfony ... Framework MVC en PHP 5,

Embed Size (px)

Citation preview

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

Sommaire

5 Vues

David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 42 / 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

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 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

Sommaire

9 Formulaires

David Annebicque (IUT de Troyes) M4D203D - POO Avancée @DavidAnnebicque 111 / 111