Chapitre 5-Symphony
Chapitre 5-Symphony
Chapitre 5-Symphony
Année universitaire
2018-2019
1
INTRODUCTION
2
SYMPHONY
2015
2014
4
SYMFONY
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.*"
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 ?
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
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)
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
The bundle can be generated anywhere. The suggested default directory uses
the standard conventions.
To help you get started faster, the command can generate some
code snippets for you.
24
C RÉER UN BUNDLE
Bundle generation
25
C RÉER UN BUNDLE
vendeur (vendor)
paquet (bundle)
contrôleurs (controller)
configuration
vues (view)
26
FICHIERS DE CONFIGURATION
27
FICHIERS DE CONFIGURATION
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
33
ROUTAGE
cutrona_test_helloworld:
path: /
defaults: { _controller: CutronaTestBundle:Default:helloWorld }
cutrona_test_helloworldT:
path: /{times}
defaults: { _controller: CutronaTestBundle:Default:helloWorldT }
requirements:
times: \d+
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+
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É
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 )
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() ;
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