Vous êtes sur la page 1sur 71

Chapitre 5

Symfony 2 & 3 - Les grandes


lignes

Dr. Mlouhi Yosra


Développement de Portail Web

Année universitaire
2018-2019

1
INTRODUCTION

2
SYMPHONY

 Lancement de symfony-project.com en 2005


 Framework Web MVC en PHP
 Créé par Sensio, agence Web française
 Utilise d’autres projets PHP : Doctrine, Propel,
PDO, PHPUnit, Twig, …
 Utilisé par d’autres projets : Drupal, phpBB,
Laravel, …
 Utilisé par de nombreux sites à travers le monde
 Philosophie : ne pas réinventer la roue
 http://symfony.com/
3
http://symfony.com/

2015

2014

4
SYMFONY

 Composants PHP réutilisables


 Framework (cadre de travail) PHP
 Base pour l’architecture d’une application Web
 Ne plus réinventer la roue : routes, formulaires…
 Code : conventions et organisation
 Architecture MVC
 Composants testés et éprouvés
 Communauté de développeurs
 Documentation
5
C OMPOSER , D EPENDENCY
MANAGER FOR PHP

6
C OMPOSER , D EPENDENCY
MANAGER FOR PHP
 https://getcomposer.org/
 Outil de gestion des dépendances de
bibliothèques
 Écrit en PHP, utilisé en ligne de commande
 Comfiguration des bibliothèques et de leurs
dépendances dans composer.js
 Installation :
curl -sS https://getcomposer.org/installer | php
ou
php -r "readfile('https://getcomposer.org/installer');" | php

7
INSTALLER SYMFONY 2 AVEC
C OMPOSER
 Composer est une archive PHP, un fichier
.phar (PHP Archive)
 Si PHP est accessible en ligne de commande,
Composer peut être exécuté comme une
commande :
 ./composer.phar
 Pour installer Symfony2 :
 composer create-project
symfony/framework-standard-edition path/
"2.5.*"

8
INSTALLER SYMFONY 2 AVEC
C OMPOSER
composer create-project symfony/framework-standard-edition Symfony
"2.5.*"

Installing symfony/framework-standard-edition (v2.5.5)


- Installing symfony/framework-standard-edition (v2.5.5)
Downloading: 100%

Created project in Symfony2


Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing jdorn/sql-formatter (v1.2.17)
Downloading: 100%

- Installing psr/log (1.0.0)


Downloading: 100%

- Installing twig/twig (v1.16.1)


Downloading: 100%

- Installing doctrine/lexer (v1.0)


Downloading: 100%

9
INSTALLER SYMFONY 2 AVEC
C OMPOSER
Would you like to install Acme demo bundle? [y/N] n
Creating the "app/config/parameters.yml" file
Some parameters are missing. Please provide them.
database_driver (pdo_mysql):
database_host (127.0.0.1): mysql
database_port (null):
database_name (symfony): cutron01
database_user (root): cutron01
database_password (null): pass
mailer_transport (smtp):
mailer_host (127.0.0.1):
mailer_user (null):
mailer_password (null):
locale (en): fr
secret (ThisTokenIsNotSoSecretChangeIt): 1234567890
debug_toolbar (true):
debug_redirects (false):
use_assetic_controller (true):
Clearing the cache for the dev environment with debug true
Installing assets as hard copies
Installing assets for Symfony\Bundle\FrameworkBundle into
web/bundles/framework
Installing assets for Sensio\Bundle\DistributionBundle into
web/bundles/sensiodistribution
10
A RCHITECTURE DES FICHIERS

11
A RCHITECTURE DES FICHIERS

 app
 L’application Web sans son code source
 src
 Les sources de l’application Web
 vendor
 Bibliothèques utilisées par l’application Web
 bin
 Fichiers binaires des bibliothèques utilisées par
l’application Web
 web
 Ressources statiques et contrôleur frontal 12
C ONTRÔLEUR FRONTAL ?

 Jusqu’à présent, vous utilisiez de multiples


scripts PHP « programme » :
 saisir_donnees.php
 valider_donnees.php
 …
 L’architecture de Symfony n’utilise qu’un seul
script « programme », le contrôleur frontal
 Tous les contenus dynamiques PHP seront
produits par ce script
 C’est le point d’entrée unique de l’application
13
PLUSIEURS CONTRÔLEURS
FRONTAUX

 Environnement de production :
 app.php
 Application telle qu’elle sera visible par les visiteurs
 Rapidité nécessaire
 Tests de cache peu poussés

 Environnement de développement :
 app_dev.php
 Application pour les développeurs
 Environnement de débogage complet
 Plus lent que la version de production
14
ENVIRONNEMENT DE PRODUCTION

 http://cutrona/Symfony/web/app.php/hello/Bob

 http://cutrona/Symfony/web/app.php/oops/Bob

15
ENVIRONNEMENT DE DÉVELOPPEMENT

 http://cutrona/Symfony/web/app_dev.php/hello/Bob

 http://cutrona/Symfony/web/app_dev.php/oops/Bob

16
PROFILER EN MODE DÉVELOPPEMENT
F LUX APPLICATIF

18
F LUX APPLICATIF

 Toutes les requêtes sont interceptées par le


contrôleur frontal
 Le noyau trouve le contrôleur via le système de
routage et exécute l’action adéquate
 Une réponse est produite

19
A RCHITECTURE MVC

 Modèle
 Doctrine2
 Accès/persistance des données
 Vue
 Twig
 Présentation des données
 Contrôleur
 Symfony
 Logique de l’application
 Utilise le modèle
 Prépare les données pour la vue
20
LES BUNDLES

21
B UNDLE ( PAQUET)

 Bundle = brique de l’application


 Gestion des utilisateurs
 Boutique
 Administration, …
 Ensemble structuré de fichiers permettant la
gestion d’une partie de l’application
 Bundles de la communauté Symfony
 http://knpbundles.com/
 FOSUserBundle
 DoctrineFixturesBundle
 WebProfilerExtraBundle, …
22
C RÉER UN BUNDLE

 Utilisation de la console
 app/console
Symfony version 2.5.5 - app/dev/debug
Usage:
[options] command [arguments]

 app/console generate:bundle
Welcome to the Symfony2 bundle generator

Each bundle is hosted under a namespace (like
vAcme/Bundle/BlogBundle).
The namespace should begin with a "vendor" name like your company
name, your project name, or your client name, followed by one
or more optional category sub-namespaces, and it should end
with the bundle name itself (which must have Bundle as a
suffix).
Use / instead of \ for the namespace delimiter to avoid any
problem.
23
C RÉER UN BUNDLE

Bundle namespace: cutrona\TestBundle

In your code, a bundle is often referenced by its name. It can be the


concatenation of all namespace parts but it's really up to you to come
up with a unique name (a good practice is to start with the vendor name).
Based on the namespace, we suggest cutronaTestBundle.

Bundle name [cutronaTestBundle]:

The bundle can be generated anywhere. The suggested default directory uses
the standard conventions.

Target directory [/home/Enseignants/cutron01/public_html/Symfony/src]:

Determine the format to use for the generated configuration.

Configuration format (yml, xml, php, or annotation): yml

To help you get started faster, the command can generate some
code snippets for you.

Do you want to generate the whole directory structure [no]? yes

24
C RÉER UN BUNDLE

Summary before generation

You are going to generate a "cutrona\TestBundle\cutronaTestBundle" bundle


in "/home/Enseignants/cutron01/public_html/Symfony/src/" using the "yml"
format.

Do you confirm generation [yes]?

Bundle generation

Generating the bundle code: OK


Checking that the bundle is autoloaded: OK
Confirm automatic update of your Kernel [yes]?
Enabling the bundle inside the Kernel: OK
Confirm automatic update of the Routing [yes]?
Importing the bundle routing resource: OK

You can now start using the generated code!

25
C RÉER UN BUNDLE

vendeur (vendor)

paquet (bundle)

contrôleurs (controller)

configuration

vues (view)

26
FICHIERS DE CONFIGURATION

27
FICHIERS DE CONFIGURATION

 De nombreux éléments de Symfony vont devoir


être configurés
 Le but est de séparer le code de l’application et
sa configuration
 La configuration consiste en un ensemble de
données structurées
 Il existe 3 formats possibles :
 XML, namespace et schémas, visuellement lourd
 PHP, namespace, instanciation, peu lisible
 YAML, simple et efficace !
 Nous retiendrons le format YAML pour les TP 28
YAML

 YAML: YAML Ain't Markup Language


 What It Is: YAML is a human friendly data
serialization standard for all programming
languages.
 YAML est un standard de sérialisation de
données compréhensible facilement par
l'humain pour tous les langages de
programmation
 Fichiers texte .yml facilement lisibles et
modifiables
29
YAML : L ES TYPES

 Chaîne de caractères
Une chaîne de caractères en YAML
'Entourée par des guillemets simples en YAML'
 Nombres
12 012 0x12 12.42 1.2e+42 .inf
 Nuls
null ~
 Booléens
true false
 Dates
2012-12-12t12:12:12.12+02:00 2012-12-12

30
YAML : L ES TYPES

 Séquences (- suivi de espace)


- XML
- YAML
 Séquences (entre crochets)
[XML, YAML]
 Couple clé/valeur (: suivi de espace(s))
PHP: 5.5.16
 Liste (indentation espaces, jamais tabulations)
xml: pas bon
yaml: bon
 Liste (entre accolades)
{xml: pas bon, yaml: bon}
31
VÉRIFICATION DES FICHIERS
YAML
 Utilisation de la console
 Un fichier particulier
app/console yaml:lint
src/Cutrona/TestBundle/Resources/con
fig/routing.yaml
 Un répertoire
app/console yaml:lint
src/Cutrona/TestBundle/Resources/config
 Un bundle complet
app/console yaml:lint
@CutronaTestBundle
32
ROUTAGE

33
ROUTAGE

 Faire correspondre une URL et une action d’un


contrôleur
 Configuration du routage général de l’application
dans app/config/routing.yml
cutrona_test:
resource: "@CutronaTestBundle/Resources/config/routing.yml"
prefix: /

 La configuration du routage d’un bundle est faite


dans ce bundle
 Import possible des routes d’un bundle dans la
configuration générale
34
ROUTAGE

 Routes dans un bundle :


src/Cutrona/TestBundle/Resources/con
fig/routing.yml
cutrona_test_homepage:
path: /hello/{name}
defaults: { _controller: CutronaTestBundle:Default:index }

cutrona_test_helloworld:
path: /
defaults: { _controller: CutronaTestBundle:Default:helloWorld }

 Chaque route est nommée


 Correspondance entre une URL et un contrôleur
 Testées dans l’ordre
35
R OUTAGE AVEC PARAMÈTRES

 Éléments entre {} dans l’URL (path: xxx)


cutrona_test_homepage:
path: /hello/{name}
defaults: { _controller: CutronaTestBundle:Default:index }

cutrona_test_helloworldT:
path: /{times}
defaults: { _controller: CutronaTestBundle:Default:helloWorldT }
requirements:
times: \d+

 Paramètres requis ou optionnels


 Contrôle de forme possible (entier, regex, enum)
 Passés en paramètre de même nom de l’action
du contrôleur correspondant 36
C ONSULTATION DES ROUTES EN
CONSOLE

 app/console router:debug --env=dev


[router] Current routes
Name Method Scheme Host Path
_wdt ANY ANY ANY /_wdt/{token}
_profiler_home ANY ANY ANY /_profiler/
_profiler_search ANY ANY ANY /_profiler/search
_profiler_search_bar ANY ANY ANY /_profiler/search_bar
_profiler_purge ANY ANY ANY /_profiler/purge
_profiler_info ANY ANY ANY /_profiler/info/{about}
_profiler_phpinfo ANY ANY ANY /_profiler/phpinfo
_profiler_search_results ANY ANY ANY /_profiler/{token}/search/results
_profiler ANY ANY ANY /_profiler/{token}
_profiler_router ANY ANY ANY /_profiler/{token}/router
_profiler_exception ANY ANY ANY /_profiler/{token}/exception
_profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css
_configurator_home ANY ANY ANY /_configurator/
_configurator_step ANY ANY ANY /_configurator/step/{index}
_configurator_final ANY ANY ANY /_configurator/final
cutrona_test_homepage ANY ANY ANY /hello/{name}
cutrona_test_helloworld ANY ANY ANY /
cutrona_test_helloworldT ANY ANY ANY /{times}

37
C ONSULTATION DU ROUTAGE
AVEC P ROFILER

38
R OUTES POUR PRODUIRE DES
URL
 Les routes permettent de faire correspondre une
URL et une action d’un contrôleur
 Cette relation est une bijection
 Le nom de la route permet de produire son URL
relative ou absolue
 Découplage complet permettant de modifier un
paramètre sans tout réexaminer/réécrire
 Sera utilisé en particulier dans les vues
 Route nommée : URL  action d’un contrôleur
 Nom d’une route  URL de la route
39
LES CONTRÔLEURS ET LES
ACTIONS

40
C ONTRÔLEURS

 Regroupés dans
src/Cutrona/TestBundle/Controller/
 Leur nom se termine obligatoirement par
Controller
 Exemple DefaultController
 Héritent de Controller du namespace
Symfony\Bundle\FrameworkBundle\Contr
oller\Controller
 Font partie du namespace Controler du
bundle : Cutrona\TestBundle\Controller
 Contiennent les actions 41
A CTIONS
 Méthodes publiques des contrôleurs
 Leur nom se termine obligatoirement par
Action
 Exemple : HelloWorldAction()
 Reçoivent automatiquement en paramètre les
paramètres des routes
cutrona_test_helloworldT:
path: /{times}
defaults: { _controller: CutronaTestBundle:Default:helloWorldT }
requirements:
times: \d+

public function helloWorldTAction($times) {


42
A CTIONS

 Briques de la logique applicative :


 Interagissent avec les données
 Présentent des données à afficher aux vues
 Retournent un objet Response du namespace
Symfony\Component\HttpFoundation\Res
ponse :
return new Response('Hello World!');
 Peuvent déclencher l’affichage d’une vue :
return $this->render(
'CutronaTestBundle:Default:index.html.twig',
array('name' => $name));
43
LES VUES

44
LES VUES
 Constituent la partie présentation de l’application
 Utilisent le moteur de templates (modèles) Twig
 Reçoivent des données du contrôleur
 Peuvent utiliser des structures algorithmiques
 Ne contiennent aucun code PHP
 Utilisent le pseudo-langage Twig à base de { }
 Les templates Twig peuvent être hérités ou
inclus pour un meilleur découpage
 Classiquement, 3 niveaux d’héritage :
application  section  page
45
LES VUES
src/Cutrona/TestBundle/Resources/view
s/Default/index.html.twig

<!doctype html>
<html>
<head><title>Hello</title></head>
<body>
Hello {{ name }}!
</body>
</html>
46
TWIG

47
TWIG : CONCEPT DE BASE
 {{ … }} Écrire dans le template, une variable
ou le résultat d’une expression
<h1>{{ page_title }}</h1>
 {% … %} Contrôler la logique du template,
instructions, états, structures algorithmiques
{% for user in users %}
* {{ user.name }}
{% else %}
No users have been found.
{% endfor %}
 {# … #} Commentaires
{# page_title : Titre de la page #}
48
ÉCRITURE DANS LE TEMPLATE

 Variables simples
<h1>{{ page_title }}</h1>
 Variables simples filtrées
<h1>{{ page_title | upper }}</h1>
 Fonctions
<a href="{{ url('_welcome') }}">Home</a>
 Attributs d’objets
<span>{{ user.name }}</span>
 Méthode d’instances
<span>{{ user.getName() }}</span>

49
PRODUCTION D’URL DANS LE
TEMPLATE
cutrona_test_helloworldtimes:
path: /{times}
defaults: { _controller: CutronaTestBundle:Default:helloWorldTimes }
requirements:
times: \d+

 URL relative
<a href="{{ path('cutrona_test_helloworldtimes',
{'times': 5}) }}">Hello (5)</a>
produit
<a href="/Symfony2/web/app_dev.php/5">Hello (5)</a>

 URL absolue
<a href="{{ url('cutrona_test_helloworldtimes',
{'times': 5}) }}">Hello (5)</a>
produit
<a href="http://cutrona/Symfony2/Symfony2/web/app_dev.php/5">Hello (5)</a>

50
VÉRIFICATION DES TEMPLATES
TWIG
 Utilisation de la console
 Un fichier particulier
app/console twig:lint
src/Cutrona/TestBundle/Resources/vie
ws/Default/index.html.twig
 Un répertoire
app/console twig:lint
src/Cutrona/TestBundle/Resources/views
 Un bundle complet
app/console twig:lint
@CutronaTestBundle
51
A CCÈS À LA BASE DE DONNÉES :
ORM D OCTRINE2

52
A CCÈS À LA BASE DE DONNÉES :
ORM
 ORM : Object-Relational Mapping
 Couche d’abstraction d’accès aux données
 Ne plus écrire de requêtes mais des objets
 Lazy loading (chargement paresseux)
 Décrire les relations entre objets
 One-To-One
 Many-To-One
 Many-To-Many
 Many-To-Many avec attributs
 Gestion personnalisée des accès si nécessaire
53
A CCÈS À LA BASE DE DONNÉES :
ORM
 Object-Relational Mapping
 Classe PHP ↔ table du SGBD
 Propriétés de l’instance ↔ colonnes de la table

54
ENTITÉ

 Mapping (mise en correspondance) entre un


objet et une table de la base de données se fait
par le biais d’une entité (Entity)
 Entité : C’est une classe qui possède des
attributs et se situe dans xxxBundle/Entity
 Annotations permettent de faire le lien avec la
base de données
 Console : Elle permet de générer
automatiquement accesseurs (getters) et
modificateurs (setters)
 La console peut générer la table de la base de 55

donnes à partir de l’entité


ENTITÉ (EXEMPLE)

 Base de données « morceaux de musique »


namespace Cutrona\TestBundle\Entity ;
use Doctrine\ORM\Mapping as ORM ;
/**
* @ORM\Entity
* @ORM\Table(name="artist")
*/
class Artist {
/**
* @ORM\Id
* @ORM\Column(type="integer")
*/
private $id ;
/**
* @ORM\Column(type="string")
*/
private $name ;
56
ENTITÉ ( GÉNÉRATION DE CODE)

app/console doctrine:generate:entities
Cutrona/TestBundle/Entity/Artist
Generating entity "Cutrona\TestBundle\Entity\Artist"
> backing up Artist.php to Artist.php~
> generating Cutrona\TestBundle\Entity\Artist

/** /**
* Set id * Get id
* *
* @param integer $id * @return integer
* @return Artist */
*/ public function getId()
public function setId($id) {
{ return $this->id;
$this->id = $id; }

return $this; …
}
57
ENTITÉ ( UTILISATION)

 Contrôleur
<?php
namespace Cutrona\TestBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Cutrona\TestBundle\Entity\Artist;
class DefaultController extends Controller
{
public function ArtistAction($id) {
$a = $this->getDoctrine()
->getManager()->find('CutronaTestBundle:Artist', $id) ;

return $this->render(
'CutronaTestBundle:Default:artist.html.twig',
array('artist' => $a)) ;
}
}

 Vue
L'artiste {{ artist.id}} est '{{ artist.name }}'
58
ENTITÉ (G ÉNÉRATION AUTOMATIQUE
DES ENTITÉS )

 doctrine peut effectuer une introspection de la


base et produire automatiquement les entités
 mapping
app/console doctrine:mapping:convert yml
src/Cutrona/TestBundle/Resources/config/doctrine/metadat
a/orm --from-database

 entities
app/console doctrine:mapping:import CutronaTestBundle
annotation

 code
app/console doctrine:generate:entities CutronaTestBundle

59
MISE A JOUR DE LA BASE DE
DONNEES
 Les modifications des entités peuvent être
rendues persistantes dans la base de données
 persist($entity) demande de persistance
 flush() synchronisation de la BD
public function ArtistUpdateAction($id, $name) {
$em = $this->getDoctrine()->getManager() ;
$a = $em->find('CutronaTestBundle:Artist', $id) ;

$a->setName($name) ;
$em->persist($a) ;
$em->flush() ;

return new Response('Modification effectuée') ;


}
60
LES FORMULAIRES

61
OBJECTIF
 Un formulaire se construit sur un objet
 Son objectif est d’hydrater l’objet
 Hydrater : affecter les attributs de l’objet
 Construire un formulaire : FormBuilder
 Ajouter des champs au formulaire, type
sémantique : text, email, integer, …
 Sécurisation automatique
 Contrôler la validité d’un formulaire
 Exploitation du formulaire dans la vue Twig :
{{ form_widget(form) }}
62
EXEMPLE D’UTILISATION DE
FORMULAIRE
public function ArtistAction($id) {
$request = $this->get('request') ;
$em = $this->getDoctrine()->getManager() ;
$artist = $em->find('CutronaTestBundle:Artist', $id) ;
$formBuilder = $this->createFormBuilder($artist) ;
$formBuilder->add('name', 'text', array('required' => true)) ;
$form = $formBuilder->getForm() ;
if ($request->getMethod() == 'POST') {
$form->bind($request) ;
if ($form->isValid()) {
$em->persist($artist) ;
$em->flush() ;
return new Response('Modification effectuée') ;
}
}
else {
return $this->render(
'CutronaTestBundle:Default:artist.html.twig',
array('artist' => $artist, 'form' => $form->createView())) ;
}
}
63
SÉCURITÉ

64
SÉCURITÉ : PRINCIPE
 La sécurité regroupe deux principes :
 Authentification (authentication)
 Droits d’accès (authorization)
 L’authentification consiste à s’assurer de
l’identité d’un utilisateur : formulaire de
connexion, authentification HTTP, …
 Authentification gérée par le firewall
 Les droits d’accès permettent de contrôler qu’un
utilisateur authentifié peut exécuter une action
 Droits d’accès sont gérés par access control
 Configuré dans app/config/security.yml 65
SÉCURITÉ : PRINCIPE

66
SÉCURITÉ : ACCÈS NON
AUTHENTIFIÉ

67
SÉCURITÉ : ACCÈS NON
AUTHENTIFIÉ

68
SÉCURITÉ : ACCÈS REFUSÉ

69
SÉCURITÉ : ACCÈS AVEC
PRIVILÈGES

70
71