Architecture Application Web
Architecture Application Web
Web
Télécom SudParis
2024-2025
CSC4101 - Polycopié
CSC4101 2024-2025 Architecture(s) et application(s) Web
2 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 3
CSC4101 2024-2025 Architecture(s) et application(s) Web
17Conclusion 197
17.1 Architecture Appli Web (”classique”) . . . . . . . . . . . . . . . . . . . . . . . 199
17.2 Architecture système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
17.3Approfondir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
17.4Conclusion de la conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
17.5Postface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
18Index 206
4 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
1 Contenu du présent
document
Poly étudiant 5
CSC4101 2024-2025 Architecture(s) et application(s) Web
1.1 Auteurs
Par ordre chronologique inverse de contributions aux versions successives du cours : Oli-
vier Berger (INF), Christian Bac (RST), Chantal Taconet (INF), Dominique Bouillet (INF).
Ce contenu additionnel du polycopié sera placé dans des blocs sur fond grisé, tel
que le présent paragraphe.
Le polycopié imprimé diffusé en début de module est probablement dans un état de ré-
daction antérieur à celui présenté en cours.
On pourra se référer utilement aux versions PDF des polycopiés de chacune des séquences,
téléchargeables sur le site du cours, pour des versions plus à jour.
1. Le système de génération des polycopiés et des slides depuis la même source est publié sur : https://
olberger.gitlab.io/org-teaching/README.html
6 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 7
CSC4101 2024-2025 Architecture(s) et application(s) Web
1ère année :
— CSC 3101 Algo. programmation (objet)
— algorithmique
— objet (en java)
— CSC 3102 Intro. systèmes d’exploitation
— shell
— CSC 3601 Modélisation, BD et SI
— données, persistence, associations
— PRO 3600 Projet dév. informatique
— interfaces graphiques (Web ?)
— Git ?
On considérera acquises les notions et savoir-faire introduits dans ces modules
de première année.
2ème année :
— CSC 4101 : VOUS ÊTES ICI !
En cas de doute : http://perdu.com/
— CSC4102, …
Objectifs d’apprentissage
— À l’issue de ce module, les étudiant(e)s […] seront capables de développer une
application Web de type site d’e-commerce (une dizaine de pages), sur la base
d’un cahier des charges fourni, en utilisant un framework PHP professionnel (Sym-
fony).
L’application sera réalisée […] en s’inspirant de versions successives d’une applica-
tion exemple fournie. Elle devra permettre la saisie de données, et aura un compor-
tement personnalisé en fonction du profil d’un utilisateur.
— ce développement sera effectué par la mise en œuvre des bibliothèques et
outils du framework objet, afin d’exploiter des fonctions de sécurité, de pré-
sentation dans des pages HTML, pour s’approcher d’une application réaliste, de
qualité professionnelle.
8 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
2.2.1 10 séquences
— Travail encadré :
— Cours intégré (aka BE ?) ~ 1h
— TP ~ 2h
— Travail autonomie hors-présentiel :
— apprentissage
— projet d’application (au fil des séquences)
TP présentiel
— Grandes salles C00x - D0x (autant que possible)
— BYOD (Bring Your Own Device)
Début semaine 3
— pour membres d’une communauté :
— gèrer un « inventaire » d’objets personnels,
— publier des « galeries » publiques
Poly étudiant 9
CSC4101 2024-2025 Architecture(s) et application(s) Web
— Synchrone encadré :
— CI (s/CI/BE/)
— TP
— Autonomie :
— fin des TP
— auto-apprentissage
— projet individuel
— évaluation des projets de vos pairs
Attention : lisser l’effort du projet au long des 8 semaines du projet (10 semaines
calandaires) !!!
Cette application sera étudiée ensemble en TPs, afin de comprendre les méca-
nismes de mise en œuvre, et de servir de source d’inspiration pour le projet.
2.2.6 Évaluation
Coordinateurs
— Olivier BERGER (B304.01 + Télétravail)
— Michel Simatic (idem)
Contact (2 en même temps) :
— [email protected]
— [email protected]
Cours Intégrés
— Olivier BERGER
Encadrants de TP
— Chourouk Belheouane
— Olivier Berger
— Éric Lallet
— Badran Raddaoui
— Mohamed Sellami
— Michel Simatic
10 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
3. Restez simple
5. Soyez agréable
6. Remerciez-les
Just sayin’
Source : Comment envoyer un email à votre professeur ?
… et le Web ;-)
Importance de la documentation de référence.
Les polycopiés sont disponible en un seul document (papier / PDF), ou séparé-
ment, pour chaque séquence en PDF.
Une version au format texte OpenDocument (.odt) est également générée pour
permettre aux lecteurs de disposer d’une version modifiable, leur permettant
d’ajuster finement les paramètres de mise en forme (polices, interlignes, justi-
fication, etc.). Celle-ci pourra, nous l’espérons, permettre une adaptation parti-
culière pour des besoins spécifiques (troubles dyslexiques, handicap, …), là où
une version PDF standardisée ne conviendrait pas à tous.
2.2.10 Outillage
Poly étudiant 11
CSC4101 2024-2025 Architecture(s) et application(s) Web
12 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 13
CSC4101 2024-2025 Architecture(s) et application(s) Web
L’objectif de cette séquence du cours est de présenter le premier grand ensemble de tech-
nologies de mises en œuvre qui vont nous servir dans les séquences pratiques du cours,
autour du langage PHP.
Les bases du langage seront étudiées en travail autonome, sur des ressources
externes.
— Besoin : Programmer des applications (couche traitements, qui s’exécute côté ser-
veur)
— Choix d’un langage ?
— Choix d’une technologie associée ?
Dans ce module, notre but est de pouvoir faire tourner une application sur un
serveur Web.
De nombreux langages et environnement de développement Web sont dispo-
nibles.
Pour une découverte de la programmation des applications Web par la pratique,
nous avons fait le choix du langage PHP et de l’environnement Symfony,
pour leur qualités dans un contexte pédagogique.
Une grande partie des aspects techniques étudiés se retrouveront dans d’autres
langages ou frameworks.
14 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
PHP « comme il faut » S’appuyer sur un cadriciel (framework) moderne comme Sym-
fony
— orienté objet
— fonctionnel
— injection de dépendances, conteneurs
— templates
— PHPDoc
— tests
— …
http://www.phptherightway.com/
La plupart des cours ou tutoriaux qu’on trouve sur PHP sur le Net datent un
peu… pourtant il existe d’excellents documents actuels, comme le site ci-dessus
« PHP the right way » de Josh Lockhart et al.
— Framework de référence
— Assemblage de beaucoup de bibliothèques
— Modèle de composants objet évolué
— Documentation
— Communauté
— Environnement de mise au point
https://symfony.com/
On utilisera Symfony 6, la version stable actuelle, dans le cours.
Attention aux documents ou tutoriaux portant sur des versions antérieures, qui
foisonnent sur le Web, et ne s’appliquent pas forcément à cette version récente
de Symfony.
Poly étudiant 15
CSC4101 2024-2025 Architecture(s) et application(s) Web
3.2.1 Langage
Hello world
<html>
<head>
<title>Test PHP</title>
</head>
16 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
<body>
<?php echo '<p>Bonjour le monde</p>'; ?>
</body>
</html>
ou bien :
<?php
PHP inline
— Mélanger la présentation (HTML) et le code (PHP)… c’est mal : maintenable ?
— On verra comment faire autrement dans une prochaine séquence.
3.2.2 La documentation
3.2.3 Syntaxe
$io->title('list of todos:');
Poly étudiant 17
CSC4101 2024-2025 Architecture(s) et application(s) Web
class MyCommand
{
private $todoRepository;
if( empty($todos) ) {
return Command::FAILURE;
}
else {
$io->title('list of todos:');
$io->listing($todos);
}
return Command::SUCCESS;
}
use Symfony\Component\Console\Command\Command;
parent::__construct();
}
18 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use App\Entity\Todo;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
parent::__construct();
}
— Commentaires améliorés
— méta-informations
/**
* Classe "Circuit" du Modèle
*/
class Circuit
{
...
/**
* Set description
*
* @param string $description
*
* @return Circuit
*/
public function setDescription($description)
{
...
Poly étudiant 19
CSC4101 2024-2025 Architecture(s) et application(s) Web
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
#[AsCommand(
name: 'app:list-todos',
description: 'List tasks',
)]
class ListTodosCommand extends Command
{
Les attributs ajoutent des méta-données dans le code source PHP, et permettent
une programmation réflexive (introspection).
On « décore » le code avec des propriétés utiles, par exemple des contraintes sur
la validité, ou le stockage des données.
On verra que le composant Doctrine, ou le routeur Symfony utilisent ces attri-
buts pour « décorer » le code, facilitant la maintenance en ne dispersant pas à
différents endroits les propriétés de l’application.
Il est préférable d’utiliser un éditeur récent compatible (comme Eclipse PDT en
version supérieure à 2023-06), pour faciliter la reconnaissance de ces attributs
et leurs ajouts dans le code.
$ php helloworld.php
20 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
La distribution PHP peut être installée en deux variantes selon le contexte d’utili-
sation.
Attention à bien spécifier la bonne variante à l’installation.
Dans le cours, nous utiliserons principalement la première, pour le développeur
PHP : pour la ligne de commande (installer le paquetage php-cli).
La seconde est plutôt utilisée pour la mise en production sur des serveurs Web.
Les bibliothèques distribuées via PEAR sont typiquement déjà installées (pré-
compilées) via des paquetages de distributions GNU/Linux. Elles ne sous inté-
resseront pas dans le contexte de ce cours.
On va par-contre utiliser Composer, dont voici quelques caractéristiques.
3.4.2 Composer
https://getcomposer.org/
Il fournit :
— gestionnaire de dépendances entre bibliothèques (et entre versions),
— téléchargement des paquetages des bibliothèques depuis packagist
— autoloader qui facilite les déclarations et les chargements associés au démarrage
des programmes,
Poly étudiant 21
CSC4101 2024-2025 Architecture(s) et application(s) Web
(since 2012-04-13)
(source : https://packagist.org/statistics, au 28/06/2023) Une fois qu’un pa-
quetage est référencé sur packagist, il est téléchargeable par d’autres dévelop-
peurs PHP grâce à Composer.
Pour publier un paquetage, il suffit par exemple de rendre public un référen-
tiel Git, ce qui facilite la contribution de paquetages PHP, en logiciel libre, par
exemple depuis GitHub.
{
"type": "project",
"require": {
"php": ">=8.1",
"symfony/console": "^6.4",
"symfony/flex": "^1.0",
"symfony/framework-bundle": "^6.4"
},
"require-dev": {
"symfony/dotenv": "^6.4"
},
"config": {
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
22 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Chaque projet contiendra donc un fichier composer.json dont le contenu est ren-
seigné par les développeurs pour y définir les dépendances particulières à télé-
charger.
Cet exemple (fictif) définit l’environnement nécessaire au développement d’une
application Symfony.
On trouve les règles suivantes :
— dépendance sur PHP 8
— dépendance des bibliothèques nécessaires à l’exécution de l’application dé-
ployée : symfony/console, symfony/flex et symfony/framework-bundle dans
leurs versions respectives (pour Symfony 6.3)
— dépendance sur la bibliothèque symfony/dotenv pour l’environnement de
développement
— configuration de l’auto-loader pour associer l’espace de noms App au
contenu du sous-répertoire src/ de l’application (les codes source PHP
écrites par le développeur s’y trouveront).
— etc.
En général, on s’inspire d’une documentation, ou on utilise un générateur, pour
ne pas avoir à comprendre tous ces détails.
Voyons maintenant comment on l’utilise.
1. Le développeur lance :
$ composer install
autoload.php
autoload_runtime.php
bin/
composer/
doctrine/
easycorp/
friendsofphp/
laminas/
masterminds/
monolog/
nikic/
psr/
symfony/
twig/
Poly étudiant 23
CSC4101 2024-2025 Architecture(s) et application(s) Web
Prefetching 19 packages
- Downloading (100%)
Voici le fonctionnement du chargement via l’auto-loader lié à Composer, pour votre culture.
En pratique tout cela à transparent.
Dans l’exemple ci-dessous, le programme PHP index.php utilise l’auto-loader pour charger
les bibliothèques nécessaires à son exécution.
Voici une bibliothèque dont le code est installé dans vendor/symfony/http-foundation/Request.php :
namespace Symfony\Component\HttpFoundation;
...
class Request {
24 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
<?php
require __DIR__.'/vendor/autoload.php';
...
$request = Symfony\Component\HttpFoundation\Request::createFromGlobals();
Les programmes utilisent des identifiants d’espaces de noms PHP et non le chemin en dur
des fichiers sources, ce qui rend le code maintenable en permettant la restructuration de
l’arbre des fichiers sources des bibliothèques.
Cf. https://www.phptherightway.com/#namespaces.
— Langage interprété
— Trouver les bugs avant exécution ?
— Tester (systématiquement)
— IDE (Integrated Development Environment), pour détecter les erreurs quand on
tape le code
Poly étudiant 25
CSC4101 2024-2025 Architecture(s) et application(s) Web
Utiliser dump()
dump($myarray);
Dans les frameworks comme Symfony on verra des outils permettant de mettre
au point plus confortablement, sans ces inconvénients, comme l’utilisation de la
fonction dump( ).
Symfony nous apportera des fonctionnalités d’environnement de développement
ou tests.
26 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Avoir une démarche de tests bien définie est indispensable Langage interprété
La meilleure technique pour assurer que le code est testé, est de l’accompagner
d’une suite de tests automatisée, qui rend explicites les tests du programme.
Nous n’aborderons pas le domaine des tests dans le présent cours faute de
temps, même si les frameworks comme Symfony apportent un support pour les
tests assez élaboré.
En PHP, c’est l’environnement PHPUnit qui est utilisé. Il fonctionne de façon
très similaire à JUnit de Java, par exemple.
Le sujet des tests sera abordé en détail dans le module optionnel CSC 4102 « In-
troduction au Génie Logiciel Orienté Objets ».
Take away
— PHP moderne
— Syntaxe objet
— Outils du développeur : Composer, dump()
Poly étudiant 27
CSC4101 2024-2025 Architecture(s) et application(s) Web
28 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette séquence de cours magistral abordera l’un des outils qui est utilisé dès les premiers
TP, et qu’on utilisera ensuite tout au long du module, l’ORM Doctrine, qui gèrera la couche
d’accès aux données dans nos développements en PHP avec Symfony.
Poly étudiant 29
CSC4101 2024-2025 Architecture(s) et application(s) Web
Object Relational Mapping peut se traduire par Mapping (en bon franglais - sic)
ou conversion objet-relationnel.
En principe, vous maîtrisez le modèle relationel, qui est un pré-requis de ce mo-
dule. De même pour le modèle objet.
Par contre, la conversion objet-relationnel a été étudiée, mais probablement pas
approfondie, d’où la nécessité de l’approfondir ici.
https://www.doctrine-project.org/projects/orm.html
— composant standard applis PHP
— bien intégré avec Symfony :
— gestion modèle de données
— intégration avec formulaires saisie données
— assistant génération de code dans Symfony
— …
Doctrine est le composant d’ORM standard qui est intégré dans Symfony. Il gère
l’accès et la persistance des données de notre application en base de données.
Il apporte de nombreuses fonctionnalités, en particulier :
— la génération d’une base de données relationnelle, à partir du Modèle ob-
jet défini par le programmeur dans les classes PHP. En général, on n’a pas
besoin d’écrire quoi que ce soit en langage SQL, ou de s’occuper des dé-
tails de tel ou tel SGBD, quand on développe une application simple avec
Symfony. Doctrine s’occupe « de tout » pour nous.
— l’articulation automatique avec les formulaires de saisie de données
de Symfony, pour le support du typage des données (vérification de
contraintes de saisie, sécurité, etc.)
Doctrine est un des composants de Symfony (http://symfony.com/doc/current/
doctrine.html), mais il est aussi utilisable dans des applications PHP, en dehors
de Symfony (http://www.doctrine-project.org/projects/orm.html).
La plupart des programmes PHP écrits avec Symfony qui seront étudiés dans ce
cours utiliseront Doctrine. Il est donc utile de mieux savoir comment fonctionne
Doctrine.
30 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Exemple modèle de données objet Todo Modéliser des tâches : classe Todo
Propriétés :
— title : chaîne
— completed : booléen
— created, updated : dates
class Todo
{
private string $title;
private bool $completed;
private DateTime $created;
private DateTime $updated;
class Project
{
private string $title;
private string $description;
class Project
{
private string $title;
private description $completed;
class Todo
{
private string $title;
private bool $completed;
private DateTime $created;
private DateTime $updated;
Poly étudiant 31
CSC4101 2024-2025 Architecture(s) et application(s) Web
Utiliser l’ORM
— Ne pas écrire les requêtes SQL de chargement / modification
— Programmer en objet avec Doctrine
— L’ORM (Object Relational Mapper) détecte les données nouvelles ou modifiées et
génère le SQL sous le capot
32 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Oublier SQL ?
— Pas toujours si simple
— Réviser un peu CSC3601 « Modélisation, bases de données et systèmes d’informa-
tion » ?
Comprendre pour debugger si tout ne marche pas comme prévu automagiquement.
Le développeur Symfony n’est pas obligé d’apprendre SQL, s’il utilise Doctrine.
Mais Doctrine n’est pas magique pour autant. Il faut notamment bien com-
prendre la syntaxe des attributs, et mieux vaut bien connaître les bases du
modèle relationnel pour ne pas faire n’importe quoi.
Poly étudiant 33
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette section présente succinctement la façon dont on peut coder en PHP les
classes du modèle de données de l’application, avec l’aide de Doctrine
Pas de typage des propriétés, en « PHP basique », mais possible en PHP moderne (et ob-
jet).
Il n’y a pas de typage strict des propiétés, en PHP, comme dans d’autres lan-
gages interprétés. Mais c’est fortement recommandé dans un style de program-
mation moderne, y compris en objet.
Une fois cette classe disponible dans l’application, on peut gérer des instances
de la classe en mémoire, par exemple en créant des objets, en les ajoutant dans
un tableau, en parcourant ce tableau, etc.
Chaque objet est identifié par sa référence en mémoire.
Dans ce qui précède, le modèle objet de PHP ressemble fort à ce que vous
connaissez déjà en Java.
/**
* @var bool Is the task completed/finished.
*/
private bool $completed;
34 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Sur la base de ce code objet standard PHP, on ajoute des méta-données qui in-
troduisent des contraintes sur les classes et leurs propriétés, que Doctrine sait
exploiter pour réaliser ses mécanismes d’ORM.
#[ORM\Entity]
class Todo
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
private int $id;
#[ORM\ManyToOne(targetEntity: Project::class,
inversedBy: 'todos')]
private Project $project;
//...
}
#[ORM\Entity]
class Project
{
#[ORM\Id, ORM\GeneratedValue]
private int $id;
Poly étudiant 35
CSC4101 2024-2025 Architecture(s) et application(s) Web
Les attributs définissent des règles de typage des valeurs des propriétés, ainsi
que la définition de propriétés multi-valuées pour gérer les associations entre
instances des classes du modèle comme étant des « tableaux » (listes d’éléments
itérables).
Elles permettent aussi de définir des contraintes : propriété obligatoire, cardina-
lités des associations, compositions, etc.
Cf. Documentation Doctrine pour l’ensemble des fonctionnalités sur le mapping
des propriétés des objets.
Notons en particulier, ici, la description d’une relation OneToMany permettant de
gérer une association.
Une fois ces différentes méta-données ajoutées au code, Doctrine peut fonction-
ner.
Tant qu’on travaille en mémoire, sur des structures de données PHP, ces anno-
tations entrent marginalement en ligne de compte.
Mais quand on souhaite charger ou sauvegarder dans la base de données les ob-
jets présents en mémoire, Doctrine fait le lien entre les objets PHP en mémoire
et une base relationnelle, via la génération de requêtes SQL.
Voyons maintenant la façon dont on peut utiliser ces classes du modèle de don-
nées, dans un projet Symfony.
On va examiner comment fonctionnent les mécanismes de Doctrine pour déclen-
cher le chargement des données depuis la base de données.
On verra plus tard, bien plus en détails, les fonctions permettant de sauvegarder
les données de l’application.
use App\Repository\TodoRepository;
#[ORM\Entity(repositoryClass: TodoRepository::class)]
class Todo
{
#[ORM\Id, ORM\GeneratedValue, ORM\Column]
private int $id;
36 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Le repository est codé dans une classe, ici TodoRepository (dont le code est pré-
sent dans src/Repository/TodoRepository.php).
Cette classe utilitaire est associée à notre entité du modèle de données Todo via
l’attribut ORM\Entity.
C’est un générateur d’instances d’une classe. C’est lui, dans Doctrine, qui sait
générer des instances, ou des collections d’instances de nos classes PHP.
C’est par son intermédiaire qu’on va charger les données depuis la base relation-
nelle.
use App\Entity\Todo;
//...
protected function execute()
{
// récupère une liste toutes les instances de Todo
$todos = $this->todoRepository->findAll();
foreach($todos as $todo)
{
//...
}
use App\Entity\Todo;
use App\Repository\TodoRepository;
//...
class ListTodosCommand extends Command {
/**
* @var TodoRepository data access repository
*/
private $todoRepository;
Poly étudiant 37
CSC4101 2024-2025 Architecture(s) et application(s) Web
Ce code est un peu complexe, car il met en œuvre des patrons de conception
avancés (Symfony est un framework moderne, complexe, si on essaye d’en
comprendre tous les détails dès le début). Rassurez-vous : on essaye de ne pas
réinventer la roue, et on utilise des générateurs de code, ou bien on s’inspire de
la documentation.
On pourrait écrire le début de ce code de façon moins condensée, pour mettre
en évidence les différentes composantes de Symfony et Doctrine mises en
œuvre.
Essayons quand même de comprendre. Accrochez-vous :
1. ListTodosCommand est la classe d’une commande que nous avons codé,
dans src/Command/ListTodosCommand.php, qui hérite d’une classe Symfony,
Command ;
2. nous surchargeons le constructeur de Command pour recevoir en argument,
une instance du ManagerRegistry de Doctrine (inutile d’approfondir ce mé-
canisme de la tuyauterie Symfony pour l’instant) :
— cet utilitaire de Doctrine nous permet de récupérer le repository d’une
classe de notre modèle de données : ->getRepository(Todo::class).
— on garde la référence de ce repository dans une propriété de notre
classe : ListTodosCommand::todoRepository (de type TodoRepository),
pour pouvoir le récupérer lorsque la méthode execute() sera appelée
3. une fois que la commande est appelée, cette propriété nous permet d’ap-
peler la méthode findAll() du repository de Todo.
Ce mécanisme d’injection de dépendances, permet à une classe d’accéder à des
services de Symfony depuis son constructeur, et on le retrouvera à différents
endroits.
C’est un peu complexe, mais ça fonctionne. Même si on ne comprend pas tous
les détails de l’usine à gaz qu’est un cadriciel moderne comme Symfony, on peut
faire confiance à la documentation pour nous dire comment faire. Et surtout, le
code devient relativement compact à écrire.
Attention : les identifiants sont uniques, mais un détail d’implémentation (valeur générée
par le SGBD).
Cette fois on accède directement à une instance par son identifiant find($id).
Mais le plus souvent, cet identifiant interne à la base de données reste caché
dans les mécanismes internes de l’application.
Chargement par sélection sur des propriétés (findOneBy()) Chargement d’une ins-
tance de Todo, étant donnés un titre et un état terminé (extrait de ShowTodoCommand.php) :
38 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
$todo = $this->todoRepository->findOneBy(
['title' => $title,
'completed' => $completed]);
Sélection via findBy… suivi du nom de propriété Méthodes findBy* nommées d’après
les propriétés de la classe (magic finders) :
Exemple :
$todos = $this->todoRepository->findByCompleted(false);
donne :
..
WHERE completed = 0;
Méthodes spécifiques de votre modèle applicatif Les classes repository sont géné-
rées avec des fonctionnalités basiques.
Si besoin, on complète le repository pour ajouter des requêtes spécifiques à notre contexte
applicatif :
class TodoRepository extends ServiceEntityRepository
{
//...
public function findLatest($page)
{
//...
}
Poly étudiant 39
CSC4101 2024-2025 Architecture(s) et application(s) Web
On n’étudie pas ici ce qui serait utilisé lors de la mise en production d’une appli-
cation, car pour l’instant, notre besoin est de tester l’application en environne-
ment de développement.
Doctrine sait examiner le code des classes PHP, pour y découvrir les attributs qui
le concernent (mécanisme d’instrospection PHP).
L’ORM en déduit les opérations à mettre en œuvre pour gérer la persistance des
données, quand le programmeur en aura besoin.
Doctrine peut ainsi générer, en fonction du type de SGBD utilisé dans le projet,
un schéma de données relationnel.
Différents types de bases de données (y compris NoSQL, clé-valeurs) sont sup-
portés avec Doctrine, même si nous utiliserons uniquement le modèle relationnel
et SQLite, dans le cours.
40 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
La base de données (fichier SQLite) est créée dans le répertoire courant, avec des tables
vides.
C’est la configuration de la base de données cible (variable DATABASE_URL dans le
fichier .env) qui indique comment générer le modèle concret, avec une syntaxe
SQL peut varier d’un SGBDR à l’autre.
Exemple :
...
Listing 4 : Contrainte d’intégrité référentielle pour clé étrangère project_id, pour matéria-
liser l’association 1-N, avec SQLite
Relations m-n ManyToMany Exemple : étiquettes (Tag) sur des tâches (Todo)
CREATE TABLE todo (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
...);
CREATE TABLE tag (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
...);
Poly étudiant 41
CSC4101 2024-2025 Architecture(s) et application(s) Web
Pour les relations m-n (configurées par l’annotation ManyToMany), Doctrine génère
une table de relation dédiée, qui groupe les clés étrangères des différents rela-
tions concernées.
Par exemple, ici, pour une association entre tâches et étiquettes (classe Tag du
modèle de données), on obtient une table dont les seules colonnes sont les clés
étrangères des deux tables todo et tag, qui constituent une clé primaire compo-
site.
C’est le rôle de l’entity manager (em) de l’ORM Doctrine d’effectuer cette synchronisation.
// entity manager
$entityManager= $doctrine->getManager();
42 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
persist() permet de « tagger » des instances qui ont été modifiées : nouvelles,
modifiées ou à supprimer.
Les instances ont été modifiées en mémoire seulement, pour l’instant. Elles sont
en attente de sauvegarde.
Ce n’est qu’à l’exécution du flush() que Doctrine effectuera réellement les re-
quêtes de suppression effectives (en SQL), en parcourant toutes les données
ainsi « taggées » et en vérifiant ce qui doit être fait : INSERT, UPDATE, ou DE-
LETE.
Qui sauvegarder à l’ajout, pour les entités liées ? OneToMany entre Project et Todo
class Project
{
public function addTodo(Todo $todo): self
{
if (!$this->todos->contains($todo)) {
$this->todos->add($todo);
$todo->setProject($this);
}
return $this;
}
Poly étudiant 43
CSC4101 2024-2025 Architecture(s) et application(s) Web
Suppression pour les entités liées Code généré par l’assistant make:entity :
class Project
{
public function removeTodo(Todo $todo): self
{
if ($this->todos->contains($todo)) {
$this->todos->removeElement($todo);
// set the owning side to null
// (unless already changed)
if ($todo->getProject() === $this) {
$todo->setProject(null);
}
}
return $this;
}
Persist ?
Possibilité gestion automatique des associations
44 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
$entityManager->persist($project);
$todo = ...
$todo->setProject(null);
$entityManager->persist($todo);
Suppression en base
En cas de doute : vérifier les requêtes générées (dans l’outil Doctrine de la barre d’outils
Symfony, ou dans les logs)
Poly étudiant 45
CSC4101 2024-2025 Architecture(s) et application(s) Web
Listing 7 : src/DataFixtures/ProjectFixtures.php
L’instruction PHP yield permet de définir un tableau de n-uplets, qui seront ren-
voyés successivement en valeur de retour lors de l’appel à une méthode généra-
trice.
Les fixtures ne servent que pour initialiser des données de test, pour un admi-
nistrateur de l’application ou un développeur.
Take Away
Postface
46 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 47
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette séquence de cours magistral présente les grands éléments du contexte du cours :
Figure 4 – « WorldWideWeb Around Wikipedia – Wikipedia as part of the world wide web »
48 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Ressources
— Documents (statiques)
— Consultation dynamique :
— ressources issues d’applications (dynamiques)
— représentation de ces ressources dans les navigateurs Web
— Éléments « virtuels » décrivants des « faits » (Web sémantique/des données)
Pour être précis, on parle de ressources, sur le Web. Cette notion est très gé-
nérique. Elle englobe des documents ou des pages de site, sans exclure des mo-
dèles plus avancés d’un Web des données par exemple.
Pour une discussion du terme, d’un point de vue historique, voir par exemple
A Short History of « Resource » in web architecture rédigé en 2009 par Tim
Berners-Lee.
Ressources liées
— Identification des ressources
— Localisation des ressources
— Agréger des ressources et leurs donner des propriétés pour créer de la connais-
sance
L’intelligence du Web réside justement dans les liens établis entre les res-
sources.
Cela permet de présenter des documents riches, mais aussi de naviguer vers
d’autres sites.
Poly étudiant 49
CSC4101 2024-2025 Architecture(s) et application(s) Web
Décentralisé
— Lier entre-elles des ressources localisées physiquement n’importe où sur Internet
— Confiance, provenance ?
C’est le travail des outils clients, comme le navigateur Web, de construire de l’in-
telligence en rendant accessible du contenu distribué, mis en ligne de façon pas
nécessairement coordonnée.
Rien ne garantit alors que le contenu est fiable, pérenne dans le temps, ou qu’on
puisse y faire confiance.
Contrairement au cas d’applications développées dans des environnements
contraints et monolithiques, les applications déployées sur le Web doivent ainsi
prendre en compte ces contraintes (on y reviendra).
Cette section décrit les grands principes architecturaux qui sous-tendent le fait
d’utiliser le Web et HTTP pour faire fonctionner des applications.
Structure générale
1. Client + Serveur
Illustration du navigateur (Web browser) Firefox, comme client Web, qui com-
munique à travers l’Internet avec un serveur Web.
Il transmet des requêtes grâce au protocole HTTP, et récupère des documents
HTML dans le contenu des réponses HTTP.
Regardons maintenant ce dont on a besoin au niveau d’Internet.
2. Internet sous-jacent
50 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
3. Côté serveur
4. Dans le navigateur
Poly étudiant 51
CSC4101 2024-2025 Architecture(s) et application(s) Web
Le cœur de l’architecture technique du Web est le protocole HTTP, qui repose sur
un modèle client-serveur.
Architecture Client-Serveur
Cette architecture est très classique et n’est pas née avec le Web.
Ici, on doit plus précisément parler d’un serveur et de multiples clients qui s’y
connectent. Sur le Web, et dans HTTP, les serveurs sont conçus pour communi-
quer systématiquement avec de multiples clients.
On rappelle qu’il est très fréquent qu’un même client parle avec différents ser-
veurs pour des tâches très courantes, comme la consultation de pages Web dans
un navigateur, qui nécessite de charger des contenus sur différents serveurs
HTTP indépendants.
52 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
L’acronyme CRUD correspond aux opérations classiques qu’on peut effectuer sur
des données : Create, Retrieve, Update, Delete.
On parle en fait plutôt d’URI que d’URL dans les spécifications, même si pour
l’instant cette subtilité a peu d’importance.
Poly étudiant 53
CSC4101 2024-2025 Architecture(s) et application(s) Web
Hyper-reference, hyper-link
Historiquement, HTML comme langage de mise en forme pour la visualisation
des ressources de type « document hypertexte »
Le navigateur permet de suivre les liens dans le graphe : le graphe n’existe pas
(à part dans un cache) tant qu’on n’a pas essayer de naviguer dessus.
Seul point « stable » : le système DNS, comme pour tout Internet.
— Composants de ce graphe :
— 3 sites/serveurs Web : www.example.com, blog.example.com,
fr.wikipedia.org
— (peut-être sur 2 serveurs (2 adresses IP) : example.com et
fr.wikipedia.org ?)
— Documents/ressources :
— http://www.example.com/index.html (HTML)
— http://www.example.com/site/faq.html (HTML)
— http://www.example.com/about.php (HTML)
— http://www.example.com/chaton.jpg (image)
— http://blog.example.com/index.php (HTML)
— http://blog.example.com/post.php?id=1 (HTML)
— http://fr.wikipedia.org/about.php (HTML)
— http://fr.wikipedia.org/Chaton (HTML)
— Liens :
— Inclusions images
— Même site
— Autre site
— Hyper-liens navigables
— Document du même site
— Document sur un autre site
— Fragment à l’intérieur d’un document
54 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Plus tard, on raffine avec le concept d’URI : cf. RFC 3986 - Uniform Resource
Identifier (URI) : Generic Syntax et standards associées.
Interopérabilité ?
— Qui peut créer des clients Web ?
— Qui peut opérer des serveurs ?
Déploiement DIY
— Raspberry Pi
— Fibre
— Debian GNU/Linux
— Apache / Nginx
— …
Poly étudiant 55
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette section présente les principes d’architecture des applications Web clas-
siques, et notamment l’architecture dite 3 tiers.
Les applications Web sont ubiquitaires aujourd’hui, mais on n’a pas forcément
toujours des idées très claires sur ce qui permet de faire fonctionner ces applica-
tions.
Cette séquence va nous permettre d’examiner les mécanismes et protocoles né-
cessaires au donctionnement d’une application Web.
5.2.1 Architecture ?
Les applications produisent des pages Web dynamiques, à partir de données issues de
bases de données.
56 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Succès historique des applications BD + Web Des applications sont réalisables fa-
cilement, dès que des programmes génèrent des pages HTML en fonction des requêtes
HTTP du client
Pour « M / Mme Michu », quand même plus convivial…
… que SQL !
Avantages
— Base de données gère l’intégrité des données (transactions, accès multiples, inté-
grité référentielle, …)
— Tient la charge (tant qu’on arrive à dupliquer l’exécution des scripts)
— Large gamme de choix du langage de programmation
Poly étudiant 57
CSC4101 2024-2025 Architecture(s) et application(s) Web
Variante ligne de commande Application Symfony Todo (cf. TP), en ligne de com-
mande :
présentation affichage sortie standard
traitement App\Command\ListTodosCommand
accès aux données Doctrine + SQLite (SQL)
Une application démarre pour une exécution pour un utilisateur unique, dans le
contexte d’un shell, en ligne de commande dans un terminal.
L’application est un processus de l’interpréteur PHP qui démarre le programme
bin/console du framework Symfony.
L’application est « monolithique », fonctionnant dans la mémoire d’un seul sys-
tème d’exploitation, en local, en un seul processus.
Les 3 couches sont des couches logiques aidant à comprendre l’architecture
fonctionnelle de l’application.
58 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
On pourrait apprendre d’autres architectures plus modernes laissant une plus grande place
aux composants sur le client (Javascript, serverless, etc.). Apprentissages complexes vue
le temps imparti.
Objectif pédagogie ! Faciliter les apprentissages, donc architecture plus classique facilite
la tâche.
Les technos du Web ne concernent plus seulement les « sites » vus dans un navigateur
sur un PC
Importance du côté client :
— Navigateur
— Moteur de rendu HTML
Poly étudiant 59
CSC4101 2024-2025 Architecture(s) et application(s) Web
Take away
— Structure de la toile
— Ressources
— Ressources liées
— Décentralisé
— Protocole client-serveur, HTTP, URL
— Applications générant des pages Web
— Modèle de couches (3 et +)
— présentation
— traitement
— accès aux données
Le lecteur intéressé pourra consulter le document Web Architecture from 50,000 feet ré-
digé par Tim Berners Lee il y a 20 ans. Il date un peu pour certains aspects, mais l’essen-
tiel est toujours applicable, étonamment.
Postface
Figures interactives On utilise un export HTML d’une illustration réalisés avec https:
//www.diagrams.net/ (moteur OpenSource de draw.io).
60 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Annexes
— URL type :
— Composantes :
1. protocole : en majorité http ou https
2. adresse / nom du serveur : www.monsite.fr
3. chemin d’accès à la ressource / document :
/projet/doc.html (ne garantit pas que le résultat est un document HTML)
1. protocole : http ou https (mais aussi ftp, file, mailto, gopher, news,…)
2. autorité : nom du serveur : www.monsite.fr + port : 8000
3. chemin d’accès à la ressource : /projet/doc
4. requête : deux paramètres : id et f
5. fragment : num42 à l’intérieur du document
Il existe aussi un sur-ensemble des URLs, les URI (Uniform Resource Identifier).
On se préoccupe plus d’identifier une ressource que de savoir comment y accé-
der. En pratique, cette subtilité ne change pas grand chose dans le cadre de ce
cours.
Pour plus de détails, voir la spécification générale des URIs (RFC 3986).
Exemples
Poly étudiant 61
CSC4101 2024-2025 Architecture(s) et application(s) Web
62 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette section présente l’historique du Web, sans entrer dans les détails tech-
niques.
6.1.1 Historique
> 30 ans
Avant le Web
— Minitel (1980-2012)
Figure 7 – Minitel 2
Hypertexte
— Memex de Vannevar Bush, dans As We May Think (Atlantic Monthly, 1945)
— Xanadu de Ted Nelson : https://fr.wikipedia.org/wiki/Projet_Xanadu (1965-…)
— HyperCard de Bill Atkinson (Apple, 1987)
— World Wide Web de Tim Berners-Lee (CERN, 1989)
Plus de détails dans https://fr.wikipedia.org/wiki/Hypertexte
Poly étudiant 63
CSC4101 2024-2025 Architecture(s) et application(s) Web
— le W3C (World Wide Web Consortium) mis en place rapidement (1994) pour définir
des standards (ouverts).
Naissance du World Wide Web Vidéo Naissance du World Wide Web (extraite de l’expo
Web du Computer History Museum) https://www.youtube.com/watch?v=_mNOXDbXr9c
6.1.2 Timeline
64 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 65
CSC4101 2024-2025 Architecture(s) et application(s) Web
6.3 Enjeux
6.3.1 Ouverture
— Ouverture de l’Internet
— Standards ouverts
— Guerre des navigateurs
— Poids de Google / Chrome
— Logiciel libre vs SaaS
— Décentralisation
— Wikipedia
— OpenStreetMap
— Données ouvertes (open data, open gov, …)
— Wayback machine de l’Internet Archive
— Asymétrie réseaux
— Centralisation
— Surveillance
— Digital labor
— Revenus (gratuité, publicité)
— Censure
— Algorithmes (recommendation)
— Accès (haut débit)
— Neutralité du net
— …
La suite sur : https://www.eff.org/work
Ce cours est essentiellement technique et ne vise pas à aborder toutes ces thé-
matiques.
On doit seulement observer que la technique n’est pas neutre, et que ces enjeux
sont de plus en plus cruciaux dans une société où le numérique occupe une part
de plus en plus forte.
Les ingénieurs doivent se préoccuper des conséquences de leurs choix technolo-
giques, autant que possible…
Le lecteur intéressé pourra consulter le document Web Architecture from 50,000 feet ré-
digé par Tim Berners Lee il y a 20 ans. Il date un peu pour certains aspects, mais l’essen-
tiel est toujours applicable, étonamment.
Postface
— Vidéo « Birth of the World Wide Web » © Computer History Museum (used by cour-
tesy of Computer History Museum).
— Diagramme « Perdu sur le Web » : #Geekscottes par Nojhan https://botsin.space/
@geekscottes/101748180337263915
66 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 67
CSC4101 2024-2025 Architecture(s) et application(s) Web
68 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Et, depuis HTTP 1.1 il indique au serveur qu’il souhaite parler au site en ques-
tion avec l’en-tête Host, pour le cas où plusieurs sites Web seraient gérés par le
même serveur qui écoute sur cette adresse IP.
Cf. Rappel : Services sur Internet (TCP/IP) en annexes pour plus de détails sur
les aspects liés au réseau.
Poly étudiant 69
CSC4101 2024-2025 Architecture(s) et application(s) Web
Requête - Réponse
On verra plus loin le détail de ce qui circule dans les messages de requêtes et de
réponses.
Transmettre des données au serveur Comment le client peut-il transmettre des don-
nées au serveur ?
Contexte explicite pour les applications dynamiques
L’URL peut contenir des informations, des variables ayant des valeurs.
Les arguments d’une méthode GET : clés - valeurs
Exemple :
http://www.monsite.fr/projet/service.php?id=3&nb=42
70 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
nom valeur
id 3
nb 42
Le corps de la requête peut aussi servir transmettre des données : ex. méthode POST
(voir ci-après)
Le séparateur ? est un mot-clé particulier dans le format des URL. Le caractère &
permet de séparer les couples clé-valeur des différents arguments transmis dans
l’URL.
Le contenu de la requête POST permet de transmettre des données plus riches
et plus volumineuses.
7.1.2 Démo
Les en-têtes sont au format RFC 822, déjà popularisé pour l’email. Pour trans-
porter autre-chose que de l’ASCII (binaire, accents, etc.) il faudra encoder / dé-
coder le contenu.
Poly étudiant 71
CSC4101 2024-2025 Architecture(s) et application(s) Web
— Exemple :
1 HTTP/1.1 200 OK
2 Date: Mon, 27 Jul 2009 12:28:53 GMT
3 Server: Apache
4 Content-Length: 72
5 Content-Type: text/plain
6
7 Salut tout le monde. Mon contenu contient un retour charriot à la fin.
8
Le contenu du message (ce qui suit la ligne vide) est particulièrement important,
mais devra être interprété par le client qui le reçoit en fonction des en-têtes.
Comme il s’agit en général d’autre chose qu’un texte simple en ASCII, les en-
têtes relatifs aux formats et méthodes d’encodage sont particulièrement impor-
tants.
Le corps/contenu du message, c’est à dire les données, est appelé payload en
anglais.
72 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Autres méthodes
— HEAD : comme GET, mais récupérer seulement l’en-tête
— POST : envoi de données pour traitement côté serveur (ex : contenu d’un formu-
laire HTML)
— PUT : envoi du contenu d’un document, pour enregistrement sur le serveur
— DELETE : suppression d’un document
— CONNECT : établir un tunnel vers le serveur hébergeant une ressource (serveur
proxy)
— OPTIONS : demande des options gérées par le serveur pour l’accès à une res-
source
— TRACE : effectue un test d’accès complet le long du chemin d’accès à une res-
source (ping / echo)
Pour une liste plus complète de toutes les méthodes des requêtes HTTP, consul-
tez http://webconcepts.info/concepts/http-method/
Keep Calm En pratique, au-delà de cette séquence, vous utiliserez et gérerez principa-
lement :
— GET
— POST
L’affaire se corsera pour ceux qui s’intéresseront aux services Web fonctionnant avec des
API sur HTTP (REST)
Poly étudiant 73
CSC4101 2024-2025 Architecture(s) et application(s) Web
Les en-têtes généraux peuvent être présents aussi-bien dans les requêtes que
dans les réponses HTTP.
En-têtes de requêtes
— Préférences du client : types, caractères, langage…
— Accept
— Accept-Encoding, Accept-Charset, Accept-Language, …
— Identification du client/serveur : site, e-mail, source…
— Host
— From
— Referer
— User-Agent
Ces en-têtes sont définis par le client qui les ajoute à partir de la 2e ligne du
message de requête
Accept définit les priorités sur le format des données que le client aimerait
recevoir de la part du serveur
Host précise au serveur sur quel site exactement les chemins d’URL sont spé-
cifiés (quand plusieurs sites sont hébergés sur la même adresse IP)
74 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
En-têtes de réponses
— Informations sur le contenu : type, taille, URL, encodage…
— Content-Type
— Content-Length
— Content-Encoding
— Content-Location
— Informations sur la date de modification ou la durée
— Last-Modified
— Expires
Poly étudiant 75
CSC4101 2024-2025 Architecture(s) et application(s) Web
L’objectif de cette section est de présenter certains outils qui vont nous servir
dans la mise au point des programmes.
Sera vu en partie TP
https://curl.haxx.se/
Client en ligne de commande
man curl
On verra dans la partie TP comment s’en servir, par exemple avec curl -v 2>&1
| less
Aussi wget, ou get autres outils populaire en ligne de commande.
76 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Symfony fournit un ensemble d’outils « cachés » dans une barre d’outils en bas
de pages Web, qui permet d’obtenir de multiples informations sur ce qui s’est
passé pendant l’exécution du rendu de la page Web : base de données, gabarits,
routage, etc.
C’est une aide précieuse pour les développeurs, et nous nous appuierons dessus
dans les TP.
Take away
— client HTTP
— serveur HTTP
— format des requêtes / réponses dans HTTP
— requêtes GET, POST, …
— status codes : 200, 40x, …
Annexes
Poly étudiant 77
CSC4101 2024-2025 Architecture(s) et application(s) Web
Rappel : adresses IP
— Les URLs peuvent contenir l’adresse IP (v4 ou v6) du serveur. Ex. : http://192.168.0.1/index.html
— Le serveur doit être lancé et écouter sur cette même IP
— Attention aux problèmes de routage des paquets (firewall, NAT, …)
— Dans les TPs on utilisera souvent localhost : 127.0.0.1 (en IPv4), car dans l’en-
vironnement de développement Symfony, client et serveur sont sur la même ma-
chine.
En TP on se connectera à un serveur Web tournant en local, démarré
depuis l’environnement de test de Symfony, donc tout se fait sur
http://localhost:8000/
Pour tester « comme en vrai », ça peut devenir un peu plus compliqué au ni-
veau réseau, selon la configuration de l’OS. Mais ceci dépasse le cadre du pré-
sent cours.
Le serveur peut connaître l’adresse apparente d’un client, mais ne peut pas tou-
jours en faire quelque chose (proxy, NAT, etc.). Dans HTTP, le serveur n’en tient
en général pas compte pour déterminer son comportement.
78 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
HTTP avancé
Notions avancées. Pas trop grave si tout ça n’est pas clair dès le départ.
Sécurité
— HTTP est en clair !
— => Utiliser HTTPS
— Mais attention : avoir confiance dans le DNS, ou se fier aux certificats
curl http://www.example.com/
GET / HTTP/1.1
Host: www.example.com
User-Agent: curl/7.50.1
Accept: */*
<html>
<head>
<title>Moved</title>
</head>
<body>
<h1>Moved</h1>
<p>This page has moved to <a href="http://www.example.org/">http://www.example.org/</a>.</p>
</body>
</html>
Poly étudiant 79
CSC4101 2024-2025 Architecture(s) et application(s) Web
Le navigateur Web n’affichera pas ce contenu HTML : par défaut, il suivra le lien
et recommencera un GET sur l’URL reçue dans l’en-tête Location
Utiliser curl -L permet de suivre les redirects.
Par défaut les navigateurs effectuent les redirects, et les outils du développeur
masquent parfois celà, sauf si on active une option permettant de garder l’histo-
rique des requêtes précédentes.
Proxy et cache
— Serveur Proxy : serveur HTTP intermédiaire
— Diminuer le trafic.
— Cache : stockage d’informations (statiques)
— Le navigateur dispose d’un cache à deux niveaux : en mémoire pour l’historique
et sur disque entre les sessions.
Ressources / Documents
— HTTP agit sur des ressources, qui ne sont pas forcément des documents stockés
physiquement sur le serveur.
— Pas uniquement du HTML (XML, JSON, RSS, HTML, PDF, JPG, CSS, JS, etc.).
— Types MIME, encodage.
— Négociation de contenu entre le client et le serveur
— Web Sémantique
Content-Negociation
— Le résultat de la requête sur une même URL dépend des en-têtes de la requête.
Accept: application/json, application/xml;q=0.9, text/html;q=0.8,
text/*;q=0.7, */*;q=0.5
Priorité Description
q=1.0 application/json
q=0.9 application/xml
q=0.8 text/html
q=0.7 text/* (ie. tout type de texte)
q=0.5 */* (ie. n’importe quoi)
80 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Poly étudiant 81
CSC4101 2024-2025 Architecture(s) et application(s) Web
L’objectif de cette section est de présenter ce qui se produit du côté des ser-
veurs HTTP, et en particulier la façon dont des programmes sont appelés en ré-
ponse aux requêtes HTTP.
On ne détaillera pas ici la façon dont le serveur Web sert des données statiques
depuis des documents, mais on se concentrera plutôt sur l’invocation des pro-
grammes, qui vont faire fonctionner les applications Web.
Mais aussi
— Vérifier la sécurité
— Gérer les performances
— …
Exemples
— Apache
— Nginx
— PaaS (Platform as a Service) prêt à l’emploi sur un Cloud, par ex. platform.sh
Dans le cours, on s’appuiera globalement sur le serveur fourni par php avec php
-S y compris quand utilisé via environnement de tests de Symfony.
On n’abordera pas les détails de configuration des serveurs Web comme Apache
ou Nginx, faute de temps.
Modèle d’exécution
1. Attendre des requêtes
2. Quand une requête HTTP particulière survient, déclencher votre programme
3. recommencer
Si plusieurs requêtes de plusieurs clients différents au même moment, même programme
exécuté plusieurs fois en parallèle
82 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
8.1.3 Multi-tâches
Poly étudiant 83
CSC4101 2024-2025 Architecture(s) et application(s) Web
Ce type de technologies est toujours utilisé même s’il n’est pas idéal notamment
en terme de souplesse pour le déploiement, pour la gestion avancée des perfor-
mances ou de la sécurité.
Historiquement, pour PHP, on utilisait par exemple beaucoup mod_php qui est un
plugin pour Apache, qui rendait l’interpréteur PHP et ses bibliothèques acces-
sibles en direct.
84 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Aujourd’hui, dans le monde PHP, avec PHP-FPM, qui devient très répandu, on se
rapproche un peu plus de ce modèle : serveur Web + serveur d’exécution PHP
bien distincts (Apache + PHP-FPM ou NginX + PHP-FPM).
PHP-FPM implémente l’API FastGCI pour la communication entre le serveur Web
et le serveur d’applications.
8.2 Déployer
Poly étudiant 85
CSC4101 2024-2025 Architecture(s) et application(s) Web
Le principe est ici de sauvegarder les modifications du code dans Git, puis de dé-
ployer une version automatiquement à partir de ce référentiel Git.
On automatise ainsi la sauvegarde d’une version bien identifiée, sans possibilité
de modification côté serveur sans être repassé par la phase de contrôle qualité
au niveau développement.
Ce mécanisme, utilisé dans l’approche DevOps permet d’automatiser et d’amé-
liorer la qualité.
Les besoins côté serveur (version du langage, type de SGBD, dimensionnement,
etc.) peuvent même être décrits dans des fichiers de configuration dans le code
source.
Cette solution, illustrée ici avec la plate-forme cloud de platform.sh et Symfony
fonctionne de façon similaire à nombre d’autres plateformes PaaS (Platform as a
Service) sur le Cloud.
La plate-forme de développement et celle de déploiement sont gérées de façon
cohérente comme un tout intégré, disponible sur le Cloud. https://fr.wikipedia.
org/wiki/Plate-forme_en_tant_que_service
Les plate-formes Cloud liées au développement d’applications ne sont pas dé-
taillées dans le cadre de ce cours.
L’objectif de cette section est de détailler la façon dont le code des applications
Web va être appelé, une fois qu’un serveur HTTP déclenche l’exécution d’un pro-
gramme en réponse à une requête.
86 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
1. définir des chemins d’URL, et autres éléments de contexte qui déclencheront l’exé-
cution du code
2. écrire les différents morceaux de code qui doivent s’exécuter quand les requêtes
arrivent sur chacun de ces chemins
Résultats d’exécution
— Statut d’un programme :
— Code de retour système (exécution d’un processus POSIX) :
— 0 ou != 0
— Résultats :
— Sortie standard du programme
— Erreur standard ?
0 ⇒ 200
!= 0 ⇒ 5xx
— Sorties
— Standard (stdout) telle-quelle dans réponse HTTP : attention au format
— Headers : succès, échecs, redirections, …
— Cookies : sessions
— Ligne vide
— Contenu du document :
— HTML
— Autres formats (APIs : JSON, …)
— Erreur standard (stderr) : dans les logs du serveur ?
Poly étudiant 87
CSC4101 2024-2025 Architecture(s) et application(s) Web
— Exécution script PHP demandé dans la requête, si présent dans public/, (ou par dé-
faut, par public/index.php)
Exemples :
Appel de méthode
— Objets : instances de classes (encapsulent un état)
— Méthodes : récepteurs de messages
class Application {
public run() {
//...
$command = new ListTodosCommand();
$res = $command->execute();
Contrôleurs HTTP Appel de méthodes dans une classe conçue pour gérer des actions
(HTTP) sur des ressources (Web)
— Classe contrôleur (Controller)
88 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
— « écoute » des événements : requêtes HTTP sur des ressources particulières propres
à cette classe
— gère les actions spécifiques à effectuer (et délègue au reste du code)
Patron de conception Model, Vue, Controller (MVC)
Routage
Poly étudiant 89
CSC4101 2024-2025 Architecture(s) et application(s) Web
— Le programmeur associe :
— schéma de chemin d’URL
— méthode d’une classe PHP « Contrôleur », à invoquer au traitement d’une re-
quête
— Le composant « Routeur » réalise les appels vers les bonnes méthodes
90 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Pour ce qui nous concerne, le contexte d’exécution en mémoire est perdu après
la fin de l’exécution du code de la méthode du contrôleur.
C’est comme si l’application s’arrêtait. Tout ce qui n’est pas explicitement sauve-
gardé est perdu.
On verra l’utilisation de la session ultérieurement dans le cours.
On notera qu’en réalité, l’application n’est pas complètement arrêtée : le code
reste en mémoire, pour traiter la prochaine requête, afin de garder des perfor-
mances acceptables. Mais les variables sont à coup sûr réinitialisées.
Take away
— serveur HTTP
— invocation des programmes qui génèrent du HTML
— programmation événementielle
— routage + controleurs Symfony
Poly étudiant 91
CSC4101 2024-2025 Architecture(s) et application(s) Web
92 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Cette section aborde trois notions liées, pour la couche présentation : pages,
ressources et vues.
— CRUD :
— Create
— Read / Retrieve
— Update
— Delete
— on s’intéresse dans un premier temps à la consultation d’une (représentation de)
ressource : méthode GET (+ URL)
— on verra la modification ultérieurement.
Questions philosophiques
— Ressource == Représentation ?
— Représentation == Visualisation réalisée par le client HTTP ?
Poly étudiant 93
CSC4101 2024-2025 Architecture(s) et application(s) Web
Page Web = représentation d’une vue de l’application (affichable dans une navigateur)
Visualisation d’une page contenant différentes ressources
— document HTML principal
— ressources additionnelles : images, feuilles de style, scripts, …
Hypertexte : proviennent pas toutes du même serveur HTTP (requêtes supplémentaires)
À noter qu’une partie de ces éléments peuvent être mis en cache dans le naviga-
teur.
94 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Fabriquer la page
soit côté serveur générer du HTML qui transite vers le navigateur dans la réponse à
une requête HTTP
soit côté client un programme Javascript s’exécute dans le contexte d’une page
chargée par le navigateur, et construit du DOM en mémoire pour enrichir cette
page (et déclenche d’autres requêtes HTTP)
Dans ce cours, principalement 1ère option (application Web « classique »)
Examinons maintenant plus eb détails les techniques dont nous disposons pour
mettre en œuvre les pages de l’application, avec les langages standard compa-
tibles avec tous les navigateurs
Poly étudiant 95
CSC4101 2024-2025 Architecture(s) et application(s) Web
9.2 HTML
9.2.1 Structure
La structure « pas forcément visible » prend tout son sens lorsqu’on ajoute du
CSS.
Tester la fonction d’affichage sans styles du navigateur.
— <article>
— <aside>
— <details>
— <figcaption>
— <figure>
— <footer>
— <header>
— <main>
— <mark>
— <nav>
— <section>
— <summary>
— <time>
Le navigateur ne sait pas forcément quoi faire de ces sections, donc il faut obli-
gatoirement un CSS associé.
Par contre, pour l’accessibilité, par exemple, on peut sauter directement à la lec-
ture des sections en ignorant les en-têtes et autres.
96 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
Listes à puces :
<ul>
<li> ... </li>
<li> ... </li>
</ul>
9.2.4 Formulaires
Soumission de données pour les applications : génère des requêtes HTTP vers des res-
sources.
-> séances suivantes
Sera vu principalement dans 2 séance.
echo "<html>...</html>";
ou
print("<html>...</html>");
Cf. la section précédente pour les mécanismes d’appel des programmes en PHP
par le serveur Web.
La sortie standard est transmise dans la réponse à la requête HTTP, d’où la pos-
sibilité d’utiliser echo ou print().
Dans d’autres langages de programmation, le principe est équivalent.
Poly étudiant 97
CSC4101 2024-2025 Architecture(s) et application(s) Web
https://twig.symfony.com/
— Moteur de templates pour PHP, utilisé dans Symfony
— Utilisable seul
— Syntaxe inspiré de Jinja (populaire en Python, avec Django)
Données à injecter
98 Poly étudiant
CSC4101 2024-2025 Architecture(s) et application(s) Web
array(
array('href' => 'products/', 'caption' => 'Produits'),
array('href' => 'company/', 'caption' => 'Société'),
array('href' => 'shop/', 'caption' => 'Boutique')
);
<!DOCTYPE html>
<html>
<head>
<title>Ma page</title>
</head>
<body>
<ul id="navigation">
</ul>
<h1>Ma page</h1>
{{ a_variable }}
</body>
</html>
Boucle for qui itère pour construire une barre de navigation contenant des liens
hypertextes, à partir d’une liste de couples (URL, titre du lien), et ajoute la va-
leur d’une variable dans le corps de la page.
Données complètes
array(
'navigation' => array(
array('href' => 'products/', 'caption' => 'Produits'),
array('href' => 'company/', 'caption' => 'Société'),
array('href' => 'shop/', 'caption' => 'Boutique')
),
'a_variable' => "Salut le monde"
);
Poly étudiant 99
CSC4101 2024-2025 Architecture(s) et application(s) Web
Salut le monde
</body>
</html>
Variable {{ var }}
Instruction {% ... %} : for i in, if, block …
Commentaire {# ... #} Différent de <!-- ... --> (commentaire HTML)
— Programmation simple
— Mélange HTML et instructions Twig
— Algorithmique basique : boucles, conditionnelles
— syntaxe à la Python
— Pattern matching (filtrage par motif)
— Structuration en motifs factorisables (va en général de pair avec les CSS)
Tests sur http://twigfiddle.com/
On verra que Twig est intégré dans Symfony, permettant de faire à peu près le
même genre de choses.
Ce genre de bouts de code PHP très simple à écrire peut être utilisé pour faire
un prototype fonctionnel et tester les Vues de l’application auprès des utilisa-
teurs, sur la base des données de test (statiques, comme la variable $data dans
l’exemple ci-dessus).
Surcharge
— Définir une structure de page standard contenant des blocs
— Compléter le contenu dans chaque page spécifique en surchargeant des blocs
<!DOCTYPE html>
<html>
<head>
{% block head %}
<link rel="stylesheet" href="style.css" />
<title>{% block title %}{% endblock %}</title>
{% endblock %}
</head>
<body>
<div id="content">
{% block content %}{% endblock %}
</div>
<div id="footer">
{% block footer %}
© Copyright 2016 by ...</a>.
{% endblock %}
</div>
</body>
</html>
{% extends "base.html.twig" %}
{% block content %}
<h1>Accueil</h1>
<p class="important">
Bienvenue sur ma page géniale
</p>
{% endblock %}
Exemple de template pour une page du site, qui surcharge (extends) le bloc
content.
Similaire à la surcharge dans les classes filles en programmation orientée objet :
spécialisation.
Mockup exécutables
On donne maintenant quelques détails sur des outils utiles à la construction des
vues, dans l’environnement Symfony.
— logs
— dump()
— Data fixtures
— ligne de commande
— barre d’outils Symfony
9.4.3 dump()
En PHP :
$var = [
'a simple string' => "in an array of 5 elements",
'a float' => 1.0,
'an integer' => 1,
'a boolean' => true,
'an empty array' => [],
];
dump($var);
En Twig :
{% dump var %}
Attention :
{% dump todos %}
Un appel à la fonction dump() dans le code PHP affiche des informations sur les
données.
C’est la même chose dans Twig, avec une syntaxe légèrement différente : c’est
une instruction à traîter, donc dump est entouré par {% et %} : {% dump todos %}.
Les données dumpées ne sont pas affichées en plein milieu de la page, mais
masquée et visibles dans une section dédiée de la barre d’outils Symfony.
Attention, toutefois à l’utilisation des doubles accolades (comme dans {{
dump(todo) }}) qui signifie, dans Twig, l’affichage d’une valeur dans la page, et
va donc afficher les données dumpées directement dans la page. Ça fonctionne,
mais ce n’est pas idéal, notamment en cas de redirection qui va supprimer le
contenu affiché.
L’utilisation de dump dans les gabarits pollue un peu le code, mais offre l’avan-
tage de ne fonctionner qu’en environnement de développement. dump n’est plus
exécuté une fois l’application déployée en production. Le code peut contenir des
instructions pour la mise au point et n’a pas forcément à être nettoyé avant la
livraison en production.
— Requêtes
— Réponses
— Gabarits
— Doctrine
— Performances
— …
Cette fois encore, comme pour HTTP, la barre d’outils affichée en bas de pages
fournit des outils spécifiques pour les gabarits, pour comprendre la compilation
des blocs, notamment.
Take away
— HTML
— Modèle, Vues, Contrôleurs
— Gabarits pour mettre en œuvre les Pages (production des pages HTML avec Twig)
— Surcharge des blocs
Postface
10 Séq. 6 : Expérience
utilisateur Web
Cette quatrième séquence de cours porte sur différents aspects de l’expérience utilisa-
teur dans l’interaction avec les applications Web.
On présentera les enjeux généraux de l’ergonomie (autrement appelée « expérience uti-
lisateur ») des interfaces utilisateur ainsi que les problématiques d’accessibilité.
On détaillera les fonctionnalités principales, dans cette optique, pour la construction et
l’habillage des pages HTML, que sont les standards Document Object Model (DOM)
et Cascading Style Sheets (CSS).
On verra enfin comment les contrôleurs de l’application Symfony permettent de gérer les
transitions hypertexte au sein des pages de l’interface d’une application Web.
Cette section présente les principes généraux qui guident la conception d’inter-
face utilisateur, en général (y compris en dehors du domaine des applications
Web)
Cf. CSC3102
Améliorations possibles avec libcurses, etc.
Pratique : tunnel via SSH : peu de bande passante, screen pour rendre la session
rémanente, Emacs, convient bien aux interfaces braille, etc.
Ergonomie
— Expérience utilisateur (User eXperience : UX)
— Utilisabilité :
— apprenabilité (novices)
— « Fléau » de l’abandon de panier
— Utilisateurs « PIP » : Pressés, Ignorants et Paresseux
Le but ultime est que l’« expérience » de navigation sur l’application soit bonne
pour les utilisateurs… sachant qu’ils n’ont pas tous les mêmes compétences, ni
les mêmes capacités.
C’est un art difficile à atteindre, en pratique.
10.2.2 Accessibilité
Vidéo : https://www.youtube.com/watch?v=DePdWynmd_Y
Source : article Comment les aveugles utilisent-ils internet ? de l’Obs Voir aussi Usage
plage braille et synthèse vocale par personne non voyante de https://design.numerique.
gouv.fr/.
Cette vidéo illustre comment les aveugles ou mal-voyants utilisent le Web, avec
plage braille et logiciel de synthèse vocale.
La problématique de l’accessibilité dépasse de loin la situation des personnes en
situation de handicap « reconnue ». Elle concerne également tous les utilisateurs
à partir du moment où leur utilisation des applications Web n’est pas idéale, car
ils sont en mode « dégradé » (petit écran sur smartphone, un seul doigt de libre,
réseau lent, environnement bruyant, etc.)
Obligations
— Règles pour l’accessibilité des contenus Web (WCAG) 2.1
— Différents niveaux de priorité / niveaux de conformité à la norme
— Principes : Perceptible, Utilisable, Compréhensible, Robuste
— Règles, critères de succès
— Techniques suffisantes et techniques recommandées
— Référentiel Général d’Amélioration de l’Accessibilité (RGAA) version 4.1.2 (avril 2023)
Principe 1 : perceptible
— 1.1 Proposer des équivalents textuels à tout contenu non textuel qui pourra alors
être présenté sous d’autres formes selon les besoins de l’utilisateur : grands carac-
tères, braille, synthèse vocale, symboles ou langage simplifié.
— 1.2 Proposer des versions de remplacement aux média temporels.
— 1.3 Créer un contenu qui puisse être présenté de différentes manières sans perte d’in-
formation ni de structure (par exemple avec une mise en page simplifiée).
Principe 2 : utilisable
— 2.1 Rendre toutes les fonctionnalités accessibles au clavier.
— 2.2 Laisser à l’utilisateur suffisamment de temps pour lire et utiliser le contenu.
— 2.3 Ne pas concevoir de contenu susceptible de provoquer des crises.
— 2.4 Fournir à l’utilisateur des éléments d’orientation pour naviguer, trouver le contenu
et se situer dans le site.
Principe 3 : compréhensible
— 3.1 Rendre le contenu textuel lisible et compréhensible.
— 3.2 Faire en sorte que les pages apparaissent et fonctionnent de manière prévisible.
— 3.3 Aider l’utilisateur à éviter et à corriger les erreurs de saisie.
Principe 4 : robuste
— 4.1 Optimiser la compatibilité avec les agents utilisateurs actuels et futurs, y compris
avec les technologies d’assistance.
etc.
https://design.numerique.gouv.fr/
Évaluation qualité
— Critères Opquast (Open Quality Standards) : https://checklists.opquast.com/fr/qualiteweb/
Voyons maintenant ce qui concerne la mise en forme, l’habillage des pages Web
de l’application.
(suite)
HTML + CSS
...
</td>
<td width="25%"</td>
</tr>
<tr> <!-- SECTION PIED-DE-PAGE == -->
<td colspan="3">Copyright ©</td>
</tr>
</table>
Faire mieux !
— Structurer la page en 6 sections, par exemple, avec des balises <div>
— Positionner le contenu de chaque section avec des règles CSS.
— Permet de faire évoluer la mise en page, par exemple sous forme linéaire et non plus
tabulaire, etc.
Même page HTML (voir sans feuille de style dans navigateur et consulter source
HTML), mais différentes feuilles de style.
C’est tout l’intérêt du CSS : changer le look d’un site / application sans avoir à
retoucher le code HTML ou les programmes, mais uniquement le CSS.
En français : maquettage.
Métier à part entière : Web design, avec des agences spécialisées
Guides de style
— Chercher « web interface style guide » sur votre moteur de recherche préféré
— Faire comme sur les applis mobiles :
— Android : Material design : https://developer.android.com/design/index.html
— Apple : Designing for iOS : https://developer.apple.com/design/human-interface-guidelines/
designing-for-ios
HTML 5
— Tout (ou presque) est possible en terme d’interface d’applications.
— Y compris l’accès à des zones de graphisme libre et l’intégration des périphériques du
téléphone/ordinateur
Exemples :
— http://trumpdonald.org/ https://funkypotato.com/gamez/trump-donald/
index.html (HTML5 « natif » ?)
— http://funhtml5games.com/?play=angrybirds (portage de GWT -> HTML5)
— https://princejs.com/
Les bons artistes copient, les grands artistes volent Avantage d’HTML : le code
source HTML dispo.
Vive le copier-coller :-)
Contenu adaptatif
— Responsive design : prend en compte la taille de l’écran automatiquement
— p. ex. : avec Bootstrap (voir plus loin)
Principe : masquer ou faire varier les propriétés des éléments de la page pour
visualiser plus ou moins de détails.
Interactions dynamiques
— Javascript
— Interactions asynchrones
10.4.1 Cascade
10.4.3 Exemple
h1 {
font-size: 60px;
text-align: center;
}
p,
li {
font-size: 16px;
line-height: 2;
letter-spacing: 1px;
}
4. dans élément :
<div class="column" style="float:left; width: 50%">
Dans toutes les pages qui contiennent cette feuille de style, un élément d’identi-
fiant myid sera sur fond bleu.
Mais via une règle placée dans une page particulière, on peut surcharger cette
règle, pour utiliser plutôt du rouge :
<head>
<style type="text/css">
#myid { background-color: red; }
</style>
On peut définir des règles de structuration des pages HTML, au niveau des gaba-
rits, en parallèle de la définition des règles de mise en forme.
Voici une méthodologie assez simple pour ce faire.
<html>
<head>
</head>
<body>
NAVIGATION
CONTENU PRINCIPAL
BAS DE PAGE
</body>
</html>
Structure sémantique
<body>
<div id="navigation">
(NAVIGATION)
</div>
<div id="menu">
(MENU RUBRIQUES)
</div>
<div id="main">
(CONTENU PRINCIPAL)
</div>
<div id="footer">
(BAS DE PAGE)
</div>
</body>
Bootstrap
Exemples
— exemples, dans la documentation Bootstrap
— exemples sur Start Bootstrap
Thèmes
— Thèmes sur Start Bootstrap
— Feuille de syle additionnelle
Take away
— Structure != présentation
— Rôle de CSS
— Principe de surcharge des feuilles (cascade)
— Accessibilité
— Bootstrap
Annexes
Sur la qualité des interfaces Web, consulter le livre « Qualité Web - La référence des pro-
fessionnels » - 2e édition - Eyrolles : http://qualite-web-lelivre.com/ (disponible à la mé-
diathèque)
Sur le sujet de l’accessibilité, vous pouvez également consulter la vidéo Voir autrement :
l’ordinateur accessible
Postface
11 Séq. 7 : Contrôleurs,
interactions CRUD,
formulaires
Cette séquence aborde les mécanismes permettant de rendre interactive une applica-
tion basée sur HTTP.
On explique la façon dont les concepteurs de HTTP on énoncé les principes ReST qui per-
mettent facilement de mettre en œuvre des interactions simples pour des API de type
CRUD (Create Retrieve Update Delete).
On explique également comment les applications Web on intégré des mécanismes per-
mettant d’offrir une expérience utilisateur riche, via les formulaires HTML pour la soumis-
sion de données.
Cette section revient sur le patron de conception MVC, déja présenté à la sé-
quence précédente.
Le contrôleur est l’élément nouveau de notre analyse, celui qui doit gérer les
événements issues des requêtes HTTP et dispatcher le travail vers les modules
de notre application. C’est le point d’entrée spécifique qui contrôle le fonctionne-
ment interactif de l’application.
Nous présentons ici le modèle conceptuel HATEOAS issu de l’approche ReST qui
sous-tend toute l’interaction dans les applications Web classiques.
Un diagramme d’états fini définit différents états possible, mais à tout instant,
un seul état actif pour une session de consultation de l’application : la page cou-
rante affichée dans le navigateur.
HATEOAS est l’un des principes du REST (REpresentational State Transfer), le
fondement de l’utilisation de HTTP pour faire fonctionner des applications.
Prononcer hay-dee-ous
(https://twitter.com/jack/status/20)
C’est les choix de nommage des chemins d’accès aux ressources qui détermine
la cohérence de l’application par rapport au schéma d’état souhaité.
Aucune contrainte particulière liée à HTTP.
Les frameworks de développement peuvent aider à mettre en œuvre des bonnes
pratiques (REST).
Le client est universel (le navigateur), stupide, c’est à dire sans connaissance
du modèle de transitions d’états de l’application, et n’a pas besoin d’être pro-
grammé par rapport à chaque application qui va être utilisée, pour savoir à quel
endroit la contacter. Il se contente de suivre la trace des liens que lui propose le
serveur, via les cibles href des balises <a>, par exemple (follow your nose).
« Services Web »
— Utiliser HTTP pour faire interagir différents programmes, sans navigateur Web, sans
humain dans la boucle :
— programme client
— programme serveur
— Services Web, APIs (Application Programming Interfaces)
— Problème : HTTP est vraiment de très bas niveau, donc il faut ajouter pas mal de stan-
dardisation par-dessus, ou que les concepteurs des programmes des deux côtés se
concertent.
HTTP peut permettre de mettre en relation des programmes clients et serveur,
notamment pour faire fonctionner des interfaces programmatiques (API) sur In-
ternet.
On peut utiliser la sémantique assez limitée de HTTP, mais qui est souvent un
peu limitée pour des applications sophistiquées.
Dans tous les cas, il faut bien comprendre HTTP pour être capable de tester /
debugger. Sinon on ne sait pas déterminer si les problèmes viennent du naviga-
teur ou de l’application côté serveur (ou des deux).
Les concepteurs d’HTTP ont intégré dans le protocole des fonctions permettant
d’interagir avec les ressources d’un serveur accessibles sur le Web, avec une sé-
mantique d’opérations couvrant aussi bien les modifications que la consultation.
Principes REST
— REpresentational State Transfer : passer de documents hypertextes à des applications
Web
— dans la Thèse de Roy Fielding en 2000 :
— HTTP 1.1 pour des applications (APIs)
— Verbes/méthodes pour une sémantique plus riche d’opérations : GET, POST + PUT
ou PATCH, DELETE, OPTIONS
— Codes de retour HTTP
— Pas de session ?
— The six constraints of the architectural style of REST (voir dessous)
Les méthodes GET ne sont plus les seules disponibles. Si on souhaite interagir
avec les ressources d’un serveur pour les modifier, on utilise les méthodes ad-
hoc. GET ne sert plus qu’à la consultation, dans ce cas (en principe).
Remarquez que ReST date de 2000, mais ce n’est qu’environ 10 ans plus tard
que ces concepts ont été revisités pour devenir les mots-clés du hype informa-
tique. Le temps pour les travaux de recherche de diffuser dans l’industrie ?
Cette section présente la façon dont les mécanismes de HTTP, que nous avons
déjà croisés, vont nous servir à mettre en œuvre la soumission de données dans
les applications Web relativement simples.
On explicite aussi pourquoi c’est le serveur qui va construire l’interface de l’ap-
plication qui saura générer les bonnes requêtes de soumissions de données, et
qu’il peut donc ainsi la déployer vers les utilisateurs.
— Différentes solutions :
— GET
— arguments dans URL
?arg1=val1&arg2=val2...
— en-têtes
— POST
— arguments dans URL
— en-têtes
— données de contenu de requête
Historiquement, GET a pu être utilisée pour transmettre des données, mais as-
sez vite, POST apparaît dans les applications Web, pour expliciter qu’il s’agit
d’une méthode dont le rôle est de transmettre des données au serveur HTTP.
D’autres méthodes suivront.
On voudrait une page dans l’application pour ajouter une tâche, du genre :
todo[completed]: 1
todo[title]: Apprendre+le+CSS
Les développeurs d’une application côté serveur ont imaginé une façon pour les
clients de transmettre des données via HTTP.
Le client HTTP doit encoder le contenu des valeurs des variables pour que ça
transite sur du texte simple via HTTP 1.1. D’où une spécification dans les en-
têtes de la requête POST du Content-Type utilisé, et l’encodage correspondant
(ici, remplacement des espaces par des +).
La sémantique de l’opération via la méthode POST sur un chemin /todo/new :
création d’une nouvelle ressource dans la collection todo.
Le serveur s’attend à ce que les noms des variables soient todo[completed] et
todo[title]… mais ça aurait tout aussi bien pu être todo_completed et todo_title,
par exemple… comment savoir ?
Vous le savez si je vous le dis, mais rien n’oblige à utiliser ce nommage. C’est
un choix du développeur de l’application, qui dépend aussi des technologies utili-
sées.
Pourquoi doit-on utiliser POST et pas GET ? C’est juste une bonne pratique REST
pour une interface CRUD via HTTP.
Il y a beaucoup de façon de faire possibles via HTTP pour faire la même chose :
il faut donc qu’on sache comment fonctionne cette application du côté serveur,
pour pouvoir interagir avec elle.
Rien n’oblige les développeurs à fournir la documentation de l’application !
L’utilisateur humain ne construit pas des requêtes HTTP (en général) : il faut une inter-
face dans un programme.
Comment mettre cette interface à disposition de l’utilisateur : déploiement de la partie
cliente de l’application ?
Les utilisateurs avancés peuvent utiliser cURL… mais en général les utilisateurs
« normaux » préfèrent un GUI, et ne pas gérer les détails d’HTTP.
Comment déployer auprès des utilisateurs un programme qui sait comment
générer la requête POST, et affiche un GUI compatible avec tous les systèmes
d’exploitation ?
Des programmes existent, comme Poster, qui est un équivalent de cURL, qui
offre une interface dans le navigateur pour la génération de requêtes CRUD
conformes à REST… mais ce n’est pas exactement l’ergonomie attendue par
l’utilisateur moyen.
Et encore faut-il lire la documentaton pour comprendre la sémantique et la
syntaxe des interactions attendue par le serveur !
Comment faire fonctionner ce type d’applications client-serveur de façon inter-
opérable, à l’échelle du Web ?
C’est le programme sur le serveur qui construit une interface (HTML) spécifique
à son application, pour que le client (stupide) puisse l’afficher aux humains.
Dans le monde Web, on n’a pas besoin de reprogrammer un client spécifique
pour chaque application et de le re-déployer.
Auparavant, des protocoles de communication client-serveur existaient, mais il
fallait développer et déployer des clients spécifiques.
C’est ce qui explique le succès de la plate-forme Web pour le déploiement des
applications.
1. Le serveur peut envoyer aux clients une page HTML contenant l’interface particulière
qui sait générer la bonne requête.
2. La page HTML contient :
— un formulaire qui est affichable (incluant tous ses widgets, pour chaque va-
riable)
— un « réflexe » qui générera une requête bien formée (POST ?) pour transmettre
les données selon les conventions du serveur
Cette section présente le fonctionnement des formulaires Web dans HTML, et les
propriétés des requêtes HTTP associées.
On détaille ensuite la façon de les gérer en PHP et avec Symfony
Redirection
— Évite de rejouer la requête de transmission du formulaire en cas de rechargement de
la page par l’utilisateur dans son navigateur
— Le serveur envoie :
— code de réponse 30x
— en-tête Location + URL de destination
On peut utiliser le code de réponse HTTP 303 pour la redirection (See other).
Attention, rend difficile le debug : les messages d’erreur du traitement de la re-
quête reçue initialement ont tendance à disparaître de l’affichage du navigateur.
On verra que la barre d’outils de mise au point de Symfony ajoute des outils in-
téressant pour ce cas.
En attendant une partie des informations utiles peuvent être vues dans l’inspec-
teur réseau du navigateur : contenu des requêtes et réponses, suivi des redirec-
tions, codes de retour, etc.
<!DOCTYPE html>
<html>
<body>
</body>
</html>
5 : Requête transmise
— Méthode POST :
<form method="post" action="/todo/new">
...
todo[completed]=on&todo[title]=Apprendre+le+CSS
<html>
<head>
<title>Résultats du Formulaire</title>
</head>
<body>
<p>Bonjour <?php
echo $_POST[todo][title] ." ". $_POST[todo][completed];
?>.</p>
</body>
</html>
On voit ici une gestion des soumissions du POST très naïve, mélangeant PHP et
HTML, fortement déconseillée en production.
Le code utilise le tableau global $_POST qui contient les données transmises dans
le code de la requête POST, dans $_POST[todo].
On a vu que ce n’est pas la meilleure façon de s’y prendre car on mélange pré-
sentation et traîtements.
Problème : si on renomme les noms des champs input, deux fichiers sont impac-
tés, le template et le gestionnaire du POST.
En outre, pas de gestion d’erreur, par exemple pour vérifier que les champs sont
bien remplis si c’est une valeur obligatoire.
On va voir qu’on peut mieux faire.
Version « deux en un »
<html>
<head>
<title>Résultats du Formulaire</title>
</head>
<body>
<p>Bonjour <?php
echo $_POST[todo][title] ." ". $_POST[todo][completed];
?>.</p>
<form method="post">
Ce qu il faut faire :<br>
<input name="todo[title]" required="required" type="text"><br>
Déjà terminé :<br>
<input name="todo[completed]" type="checkbox">
<br><br>
<input type="submit" value="Ajouter">
</form>
</body>
</html>
$this->render ( 'todo.html.twig', [
'id' => $id,
'todo' => $todo
] );
Routage des requêtes venant de la route (URL) /todo/show/ID vers une méthode
de la classe Controller qui traîte la requête (GET).
On donne un nom à cette route, qu’on appelle todo_show, de façon à pouvoir la
référencer ultérieurement, par exemple pour renvoyer vers cette page de l’appli-
cation.
Les contrôleurs permettent de gérer des interactions fines comme les méca-
nisme d’affichage d’un formulaire HTML et de soumission de ses données
return $this->render('todo/new.html.twig', [
'formulaire' => $form->createView(),
]);
}
Gabarit Twig de la page new Code HTML minimal d’un formulaire (liste pas tous champs
de saisie des propriétés d’une Todo)
{% extends 'base.html.twig' %}
{% block body %}
<h1>Ajout d'une nouvelle tâche</h1>
{% endblock %} {# body #}
Listing 11 : templates/todo/new.html.twig
function createNewTodoForm()
{
$todo = new Todo();
$formbuilder =$this->createFormBuilder($todo);
$form = $formbuilder
->add('title')
->add('completed', CheckboxType::class,
array('required' => false))
->getForm();
return $form;
}
Le contrôleur Symfony gère la soumission des données prévue dans le form HTML généré
par le gabarit
return $this->redirectToRoute('todo_index');
}
// ...
En entrée de la soumission, la requête POST vers /todo/new est cette fois ai-
guillée vers la route todo_new_post qui invoque newPost( ).
Notez que les deux routes GET et POST sur la même ressource /todo/new in-
voquent deux méthodes différentes du contrôleur (resp. newGet() et newPost())
puisque l’attribut methods des annotations @Route est différent dans chaque mé-
thode.
Le formulaire va aller chercher les données qui l’intéressent dans la requête
($form->handleRequest($request)), en fonction de la façon dont il a été construit
par createNewTodoForm().
Comme le formulaire a été « câblé » vers une instance de la classe Todo (dans
$this->createNewTodoForm($todo)), l’appel à $form->isValid() renseigne le
contenu de cette instance avec les données saisies (si les contraintes de saisie
sont respectées : présence des attributs obligatoires, etc.)
On peut alors utiliser les instructions Doctrine, pour sauver cette nouvelle ins-
tance en base de données (l’ajouter, puisqu’elle ne correspond pas à un identi-
fiant connu en interne).
Historique des requêtes, dans le profiler, pour visualiser les détails de la requête POST,
avant la redirection :
Encore un générateur :
symfony console make:crud Todo
Crée pour nous tous ces éléments de formulaires :
created: src/Controller/TodoController.php
created: src/Form/TodoType.php
created: templates/todo/_delete_form.html.twig
created: templates/todo/_form.html.twig
created: templates/todo/index.html.twig
created: templates/todo/show.html.twig
created: templates/todo/new.html.twig
created: templates/todo/edit.html.twig
TodoType
11.4.6 Sécurité
Take away
12 Séq. 8 : Gestion
contextuelle des
formulaires
Cette section revient sur les fonctionnalités des formulaires de Symfony, pour détailler le
fonctionnement des mécanismes qu’on a utilisé jusqu’ici dans le cours, et approfondir des
éléments plus avancés.
— Affichage d’un formulaire HTML : méthode d’un contrôleur (insertion d’un formu-
laire dans un template)
— Gestion de la soumission du formulaire : méthode du même contrôleur (par exemple
la même méthode)
Passer à une seule méthode :
— Rendre le code plus compact
— Lisibilité ?
Examinons tout d’abord le code à deux méthodes qu’on a déjà vu :
return $this->render('todo/new.html.twig', [
'todo' => $todo,
'form' => $form->createView(),
]);
}
return $this->redirectToRoute('todo_index');
}
# else {
return $this->render('todo/new.html.twig', [
'todo' => $todo,
'form' => $form->createView(),
]);
# }
}
Les deux méthodes foctionnent de concert, l’une gérant la requête GET initiale,
et l’autre la soumission des données dans la requête POST.
La gestion de la continuité entre ces deux méthodes s’effectue grâce à la classe
gestionnairede formulaire TodoType.
return $this->redirectToRoute('todo_index');
}
return $this->render('todo/new.html.twig', [
'todo' => $todo,
'form' => $form->createView(),
]);
}
La méthode unique gère à la fois les requêtes GET et les requêtes POST.
En cas de requête GET, isSubmitted() sera faux.
Moins de code à écrire, mais moins simple à comprendre si on n’a pas étudié la
décomposition en deux méthodes.
Symfony peut aussi générer des classes contenant le code des contrôleurs et les for-
mulaires
// Gestion du POST
if ($form->isSubmitted() && $form->isValid()) {
$todoRepository->add($todo, true);
{% extends 'base.html.twig' %}
{% block main %}
<h1>Create new Todo</h1>
{{ include('todo/_form.html.twig') }}
Gabarit templates/todo/_form.html.twig :
{{ form_start(form) }}
{{ form_widget(form) }}
<button class="btn">{{ button_label|default('Save') }}</button>
{{ form_end(form) }}
L’examen des propriétés des attributs de Todo permet de générer des champs de
saisie de formulaires HTML ad-hoc.
Y compris pour le champ project qui permettra de sélectionner un projet exis-
tant dans une liste défilante.
On voit comment on a spécifié ici que l’attribut completed sera affiché sous forme
de liste à choix multiples, plutôt qu’une case à cocher, par exemple.
Dans la plupart des méthodes des contrôleurs CRUD, on va agir sur une entité
de la base de données, identifiée par son identifiant unique transporté dans les
paramètres fournis par le client dans l’URL.
On peut utiliser ce mécanisme MapEntity pour effectuer le chargement automa-
tique des données, et s’éviter l’écriture des appels à find().
En cas de chargement infructueux, la gestion de l’erreur 404 est automatique.
la référence au projet de la tâche (Todo::project) est gérée comme une propriété « or-
dinaire » de la tâche dans le formulaire
Résultat : liste de choix parmi les projets
On voudrait disposer d’un bouton directement sous la liste des tâches d’un pro-
jet permettant d’en ajouter une nouvelle, pointant vers un formulaire ayant déjà
la connaissance du projet, sans avoir à le sélectionner, comme précédamment.
Code final
#[Route('/project/{id}/addtodo', name: 'todo_add',
methods: ['GET', 'POST'])]
public function addTodo(Request $request, Project $project,
TodoRepository $todoRepository): Response
{
$todo = new Todo();
$todo->setProject($project);
$todoRepository->add($todo, true);
// ...
Contexte :
— chargement automagique du projet d’après l’{id} de la route
— tâche créée dans son projet :
$todo->setProject($project)
Dans cet exemple, l’Entity Value Resolver associe l’identifiant présent dans la
route ({id}) au chargement de l’instance de Project attendue en argument.
Ensuite, la seule chose qui change par rapport au code de new() vu précédam-
ment, est l’initialisation de l’association entre la nouvelle tâche et son projet,
réalisée via $todo->setProject($project).
Il ne reste plus qu’à modifier le comportement du formulaire, pour qu’il n’affiche
plus le champ de saisie du projet quand ce n’est pas nécessaire.
Exemple : utilisation de VichUploaderBundle pour mettre des photos dans les Pastes
— Formulaire upload de photo
— Stockage dans public/
— Affichage dans gabarit
#[ORM\Entity(repositoryClass: PasteRepository::class)]
#[Vich\Uploadable]
class Paste
{
//...
#[ORM\Column(nullable: true)]
private ?string $imageName = null;
#[Vich\UploadableField(mapping: 'pastes',
fileNameProperty: 'imageName')]
private $imageFile;
// .../...
/**
* @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $imageFile
*/
public function setImageFile(?File $imageFile = null): void
{
$this->imageFile = $imageFile;
//...
}
L’attribut imageName stockera dans la base de donnée le nom de l’image qui a été
téléversée. Il n’est pas destiné à être modifié par l’utilisateur (on le désactivera
ci-après).
L’attribut imageFile sert à gérer la soumission dans le formulaire qui sera envoyé
par le navigateur. Il n’a pas son pendant dans la base de données. Il sert uni-
quement à la soumission dans le formulaire HTML et l’envoi d’un fichier encodé
dans le contenu de la requête POST.
Take Away
Dans une première partie, on va étudier la façon dont les sessions permettent des inter-
actions évoluées, au-dessus des requêtes et réponses HTTP successives, afin que l’utilisa-
teur fasse l’expérience d’une réelle session applicative, et bien que le serveur HTTP soit
naturellement sans état.
Dans un deuxième temps, on va présenter le principe des mécanismes de contrôle d’ac-
cès qui seront mis en œuvre pour reconnaître les utilisateurs de l’application et leur don-
ner la permission d’utiliser ou non les fonctionnalités de celle-ci.
Les serveurs HTTP sont basés sur les principes d’architecture REST, donc sans
état (stateless).
Pourtant les applications Web fonctionnant sur le serveur doivent connaître et
reconnaître les utilisateurs et leurs clients HTTP pour offir une expérience utilisa-
teur satisfaisante.
Cette section présente le mécanisme des sessions qui permet aux applications
Web de palier au caractère sans état du serveur HTTP.
À chaque requête :
1. démarrage application
2. routage vers méthode Contrôleur
(a) chargement depuis base et/ou session
(b) traitements
Avec une application Web, chaque clic sur un lien (ou autres actions) réinitialise-
rait l’état de l’application à zéro ?
L’enjeu a été de résoudre cette contradiction en ne réinitialisant pas l’état de
l’application à chaque action de l’utilisateur.
— Le programme Web peut stocker un état (par ex. en base de données) à la fin de chaque
réponse à une requête
— Il peut le retrouver au début de la requête suivante
— Le client doit pour cela se faire reconnaître
— Simule une session d’exécution unique comprenant une séquence d’actions de l’utilisa-
teur
Besoin de fonctionnalités côté serveur : pour purger le cache de sessions pério-
diquement, gérer la sécurité …
Attention aux boutons de retour en arrière du navigateur
— Identifie le client
— Commun à un ensemble d’URLs
13.1.7 Cookies
— Juste un « jeton » unique sur un certain périmètre (serveur, chemin d’URL, application,
…)
— Format choisi par le serveur
— Taille limitée :
— peut contenir des données de l’application
— pas un état de l’application complet
— Données en clair dans le stockage de cookies du navigateur
— Durée de vie potentiellement grande
La « même » page Web accédée par deux clients présentant des ID de cookies
différents, ne sera peut-être pas le même document, s’il est généré dynamique-
ment en fonction des informations présentes dans la session.
Là où le cookie est stocké côté client HTTP, la session correspondante est sto-
ckée côté serveur.
La session est potentiellement grosse, peut-être stockée en base de données,
ou dans des fichiers… Mais pas dans la même base de données que le Modèle de
l’application.
En pratique, le plus souvent, cette session est stockée sur un système de fi-
chiers ou dans une mémoire partagées (pour la gestion de cohérence si le ser-
veur d’application est dans un environnement d’exécution distribuée avec des
exécutions successives sur des serveurs différents).
La plate-forme du langage de programmation rend l’utilisation de la session très
facile pour le programmeur, en masquant la complexité sous-jacente. Cf. https:
//symfony.com/doc/current/session.html pour Symfony.
— Créé lors de la première requête d’un client (n’ayant pas fourni ce cookie)
— Le serveur délivre les cookies en les intégrant dans en-têtes de réponse HTTP
— utilise l’en-tête particulier « Set-Cookie » (sur une ligne)
Set-Cookie: <nom>=<valeur>;expires=<Date>;domain=<NomDeDomaine>; path=<Path>
— Le client stocke le cookie reçu dans la réponse, pour pouvoir le renvoyer aux prochaines
requêtes vers ce serveur
— Exemple de réponse HTTP :
HTTP/1.1 200 OK
Server: Netscape-Entreprise/2.01
Content-Type: text/html
Content-Length: 100
Set-Cookie: clientID=6969;domain=unsite.com; path=/jeux
<HTML>...
— Par la suite, ce cookie sera renvoyé par le client au serveur, dans chaque requête ayant
comme URL de début :
http://www.unsite.com/jeux/...
— Requêtes HTTP déclenchées lors demandes de transition d’un état à l’autre de l’ap-
plication
— L’exécution (PHP) résultante s’effectue sur serveur HTTP sans mémoire des interac-
tions précédentes entre client et serveur (stateless)
— L’utilisateur a une impression de continuité : une seule session d’utilisation de l’ap-
plication, où requêtes successives ont des relations de causalité
— Différentes solutions techniques, dont les cookies
Une autre solution consiste par exemple à matérialiser l’historique des dialogues
requête-réponse précédents entre le même client et le mêm serveur dans l’URL
(arguments).
Cette section présente le principe des mécanismes de contrôle d’accès qui seront
mis en œuvre pour reconnaître les utilisateurs de l’application et leur donner la
permission d’utiliser ou non les fonctionnalités de celle-ci.
Dans la vie d’une entreprise, on peut déployer des applications sans nécessaire-
ment les déployer sur le Web, sur Internet, donc ouvertes à tous les vents…
Mais on rend alors l’accès délicat : intranet/extranet, nécessité d’un VPN, com-
patibilité avec terminaux mobiles, utilisateurs nomades, etc.
Déployer sur le Web garde des avantages.
Il faut partir d’un principe de mise en place de contrôles effectifs, d’autant plus
si le code source de certains éléments de l’application est facilement récupérable
(HTML, JS).
Attention aussi à protéger l’accès aux « couches basses » : middleware, base de
données, code source, fichiers de configuration.
Le Cloud n’aide pas, de ce point de vue (repositories de code publics, stockage
Cloud non-protégé).
Contrôle effectif
— Au niveau de la configuration du serveur (ne pas permettre aux clients de découvrir
les failles en regardant le source)
— Dans les fonctionnalités du logiciel : configuration dans le code du projet Symfony
(module « firewall »)
— Mesures complémentaires (audit, etc.)
1) Identification
— Identifiants :
— email
— identifiant d’utilisateur (login)
— certificat client X509 (TLS)
— Jeton dans un en-tête HTTP
— …
— L’identification doit être confirmée par l’authentification
2) Authentification
— Vérifie client agit bien pour le propriétaire légitime de l’identifiant présenté
— Protocole de vérification :
— mot-de-passe
— signature valide d’une donnée quelconque (challenge) avec la clé privée associée
au certificat client
— délégation à service externe (Shibboleth/CAS, OAuth 2, …)
— 2FA (two-factor authentication)
— nouveaux standards : U2F, Fido, TOTP, …
— …
3) Autorisations
— Permissions applicatives associées à l’identifiant
— Pour une certaine période
— Génération d’un jeton temporaire (session authentifiée)
— Cookie
Alors que l’authentification peut être déléguée, la gestion des autorisations est
du ressort du développeur de l’application.
13.3.1 Mécanismes
— Authentification HTTP
— Authentification « Basic »
— autres
— Authentification applicative
Figure 31 – Source : Why I’m Using HTTP Basic Auth in 2022 par Joel Dare
— Mot-de-passe
— « base de données » de comptes
Formulaire d’authentification
— Formulaire « standard »
— Champs :
— Login ou email
— Mot-de-passe (saisie cachée)
Le formulaire est assez standard, mais recèle, en pratique des champs cachés
que l’utilisateur ne voit pas.
Vérification de l’authentification
— Comparer avec profil d’utilisateur connu (en base de données)
— Générer une session pour reconnaître l’utilisateur par la suite
— Attention : attaques « force brute »
— Invalider un compte/profil, ou faire une gestion de surcharge qui désactive les
tentatives (throttling, blacklist réseau, etc.)
Pour contrer les attaques par force brute, différentes stratégies sont possibles,
qu’on ne détaille pas plus dans ce cours.
On va voir un peu plus loin l’utilisation d’un mécanismes de ce type, les CAPT-
CHA.
Dans Symfony
— Composant Security
— Flexible : gestion souple et extensible de l’authentification
— Gère par exemple les utilisateurs dans la base de données via classe User + Doctrine
— Assistants générateurs de code pour les dialogues
Procédures ?
— Gestion des mots-de-passe (qualité aléa, longueur, stockage approprié, etc.)
— Récupération de compte si oubli mot-de-passe
— Canal sécurisé ou envoi jeton de réinitialisation sur email (implique gestion emails)
— Confirmations d’authentification pour sections critiques de l’application
— Garder des traces (audit, obligations légales)
— Conformité RGPD (données personnelles dans les profils)
Captcha Completely Automated Public Turing test to tell Computers and Humans Apart
Vérifier qu’un humain est aux commandes
— Pas infaillible
— Problèmes accessibilité
— Travail dissimulé
— Surveillance
Tout comme pour les CDN (Content Delivery Network) ces Captcha sont opé-
rés par des tiers, et peuvent donc leur servir à tracer les utilisateurs des appli-
cations, ce qui est potentiellement problématique à l’ère post-Snowden, et au
regard du RGPD.
De plus, pour l’exemple de l’illustration « CAPTCHA et digital labo », les Capt-
cha de ce type peuvent permettre à leurs opérateurs (ici Google) d’entrainer des
mécanismes d’IA grâce au travail « bénévole » (contraint) des utilisateurs qui es-
sayent de résoudre le puzzle… en espérant que ça ne serve pas in-fine à des ap-
plications militaires, par exemple (véhicules ou systèmes d’armes autonomes) !
Pour une ressource récente sur le sujet, voir CAPTCHA : les machines « prouvent
» plus rapidement qu’elles sont des humains (NextImpact août 2023)
13.4.2 Permissions
Cette section présente la façon dont on peut mettre en œuvre les mécanismes
d’authentification et de contrôle d’accès dans Symfony.
13.5.1 Flexibilité
— Rôles
— Ajouter des formulaires (+ templates) :
— Login + password
— Logout
— (Inscription, rappel du mot-de-passe, …)
On utilise les assistants générateurs de code pour mettre en place une classe
utilisateur et un contrôleur et ses formulaires nécessaire à l’authentification.
namespace App\Entity;
use App\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity(repositoryClass: UserRepository::class)]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
// ...
# security.yml
role_hierarchy:
ROLE_CLIENT: ROLE_USER
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN]
13.5.5 Firewall
# app/config/security.yml
security:
# ...
firewalls:
# ...
default:
# ...
access_control:
# require ROLE_ADMIN for /admin*
- { path: ^/admin, roles: ROLE_ADMIN }
$this->getUser()
// ...
$email = $this->getUser()->getEmail();
$post->setAuthorEmail($email);
Gabarits Twig
{% if is_granted('ROLE_ADMIN') %}
<a href="...">Delete</a>
{% endif %}
Une fois que le filtrage des accès possibles est bien en place, et vérifié active-
ment dans le code, comme exposé ci-avant, on peut finir le travail en spéciali-
sant l’affichage dans les pages.
Ici, on supprime par exemple les liens pointant vers des routes qui ne seraient
pas accessibles à un utilisateur qui ne disposerait pas du rôle adéquat.
— équivalent à :
if (! $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
throw $this->createAccessDeniedException('Access denied!');
}
La syntaxe des exceptions en PHP est assez similaire à cette de Java déjà suppo-
sée connue.
Take away
— Sessions
— Cookies
— Session Symfony
— Contrôle d’accès
— Principes
— Identification
— Authentification
— Autorisations
— Rôles (RBAC)
— Contrôle dans Symfony
13.6 Postface
14 Séq. 9 : Interface
dynamique côté navigateur
Cette séance introduit les mécanismes permettant la mise en œuvre de certaines fonc-
tionnalités des applications Web du côté du client, dans le navigateur Web.
On présente les technologies JavaScript comme JQuery, qui permettent par exemple de
rendre l’interface des applications plus dynamique et d’améliorer l’expérience des utilisa-
teurs.
Jusqu’ici, l’interface des applications Web est basée sur le contenu de pages HTML pro-
duites sur le serveur, et visualisée par le navigateur.
On introduit ici les mécanismes permettant de faire tourner du côté du client Web, dans
le navigateur, du code applicatif qui servira à modifier le contenu de l’arbre DOM de
ces pages.
L’utilisateur peut donc percevoir une interface modifiée dynamiquement, de façon in-
dépendante du serveur d’origine, en fonction de ses interactions avec le navigateur
(mouvements souris, etc.).
Ce code exécuté sur le navigateur peut inclure le chargement de ressources addition-
nelles depuis la Toile, permettant ainsi d’intéragir avec de multiples serveurs ou de réa-
liser des agrégations de ressources, comme cela a été popularisé par l’émergence du Web
3.0 avec l’approche AJAX.
Cette section vise à montrer les limites des formulaires « basiques » tels qu’ils
sont générés par l’assistant de Symfony make:crud, et à voir comment obtenir
une expérience utilisateur améliorée, notamment pour les champs des attributs
multi-valués.
Version de base
<?php
//...
;
Listing 17 : form builder pour Project dans src/Form/ProjectType.php
Champ par défaut : liste à sélection multiple Problème : comment sélectionner plu-
sieurs valeurs ? (Crtl + clic)
Encore faut-il réparer la sauvegarde 'by_reference' => false nécessaire pour que ça
sauvegarde les modifications sur les tâches du projet … merci la doc…
<?php
//...
<?php
//...
class ProjectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('description')
->add('todos', null, [
'multiple' => true,
{% extends 'base.html.twig' %}
{% block body %}
<h1>Edit Project</h1>
{{ include('project/_delete_form.html.twig') }}
{% endblock %}
{{ form_start(form) }}
{{ form_widget(form) }}
<button class="btn btn-primary">{{ button_label|default('Save') }}</button>
{{ form_end(form) }}
{{ form_start(form) }}
{% form_errors(form)
{{ dump form.todos %}}}
<div class="row">
<div class="col">
{{ form_row(form.title) }}
{{ form_row(form.description) }}
</div>
<div class="col">
{{ form_row(form.todos) }}
</div>
</div>
<button class="btn">{{ button_label|default('Save') }}</button>
Cf. documentation Symfony How to Customize Form Rendering pour savoir com-
ment remplacer {{ form_widget(form) }} par du code HTML plus spécifique.
Améliorer l’affichage des checkboxes Surcharge du gabarit par défaut… c’est fai-
sable, mais à quel coût…
Cf. documentation Symfony How to Work with Form Themes pour savoir com-
ment surcharger des éléments de construction des fragments de gabarits, qui
génèrent le code HTML pour les champs pour les collections.
Ça fonctionne, mais probablement risqué si Symfony évolue et qu’on obtient
quelque chose de difficilement maintenable
Et pour le projet ? Faites-en sorte que ça fonctionne… mais on n’est pas là pour faire
une vraie application, donc ne pas faire tout cela.
Des listes à sélection multiple peuvent suffire… même si Ctrl+clic ce n’est pas formidable.
Sinon, explosion de l’effort nécessaire.
{% extends 'base.html.twig' %}
...
Cette section présente le principe des interfaces Web dynamiques, où les pages
visualisées par le navigateur Web sont modifiées directement sur le navigateur,
via des programmes en JavaScript.
Jusqu’à présent, nous avons travaillé sur un modèle d’application dont les vues
reposent sur des pages HTML qui sont intégralement calculées côté serveur et
où la grande majorité des interactions sont gérées par le Contrôleur dont le code
est côté serveur.
Seul le CSS introduit des éléments de variabilité côté client, mais le HTML reste
inchangé.
« HTML dynamique »
14.3 JavaScript
Abrégé : JS
— Langage de script orienté objet non typé
— Pilier dans la création d’applications Web
— Principalement utilisé côté client : interprété par les navigateurs Web
— Mais peut aussi être utilisé côté serveur (exemple NodeJS)
Aujourd’hui, JavaScript peut être utilisé pour programmer le backend côté ser-
veur, par exemple avec NodeJS, en lieu et place de PHP.
Dans ce cours, et dans votre projet, vous utiliserez cependant Javascript unique-
ment pour l’exécution dans le navigateur.
— Améliorer les temps de réponse (exécution côté client, pas de latence d’envoi vers le
serveur)
— Contrôler les données des formulaires avant envoi vers le serveur (éviter les envois
erronés)
— Réaliser des pages animées
— Modifier le contenu, le style de la page courante en fonction des actions de l’utilisateur
sur la page
14.3.3 Historique
— Développé en 1995 par Brendan Eich pour Netscape (nom d’origine LiveScript)
— Grand succès au début du Web (mais nombreuses incompatibilités entre navigateurs)
— Nombreuses étapes de standardisation nécessaires
— ECMA (European Computer Manufacturers Association) a défini le standard EC-
MAScript
— L’arrivée d’AJAX avec le Web 2.0 replace JavaScript au premier plan (> 2005)
JavaScript devient même populaire hors du Web. Ex. programmes pour l’envi-
ronnement de bureau Gnome Shell
14.3.5 Plate-forme
— L’interface DOM (Document Object Model) standardise les méthodes pour accéder par
objets aux documents
— Nombreuses bibliothèques (frameworks) aident à programmer.
Ex : Dojo, Rialto, Angular, JQuery, Yui…
— « bytecode » pour programmer à un plus haut niveau, dans un langage compilé en JS :
TypeScript, …
— JSON (JavaScript Object Notation) utilise la notation des objets JavaScript pour trans-
mettre de l’information structurée
{
"nationalTeam":"Norway",
"achievements":[
"12 Olympic Medals",
"9 World Championships",
"Winningest Winter Olympian",
"Greatest Nordic Skier"
],
"name":"Bjoern Daehlie",
"age":41,
"gender":"Male"
}
14.3.6 Utilisation
<head>
<script>
code javascript (fonctions, variables...)
</script>
</head>
<head>
<script src="monprog.js"></script>
</head>
<input type="button"
onClick="alert('clic sur bouton');">
<a href="javascript:affiche(menu);">
function hello() {
alert("hello");
}
<body onLoad="init(1);">
Exemple
// Création d'une variable
var etienne = {
nom : "etienne";
branche : "marketing";
}
Attributs et méthodes
— Les attributs d’un objet correspondent aux attributs des balises HTML (par exemple
height, width, name, src … pour l’objet image)
— Les méthodes correspondent aux fonctionnalités du navigateur (par exemple back, for-
ward, go pour l’historique (history))
— Certains attributs et méthodes sont communs à un ensemble d’éléments
Se rapporter aux références pour connaître les méthodes et attributs d’un élé-
ment, par exemple Référence W3School
Outil : console JS
— console de développement du navigateur
— Possibilités variables selon les navigateurs
— Indication des erreurs de syntaxe
— Inspection du contenu des variables
— Débogueur, points d’arrêt, affichage des variables
— Affichage d’informations sur la console :
— Affichage des erreurs de syntaxe éventuelles
— Par programme avec la fonction consoleLog(« message » + variable)
14.4.1 DOM
<html>
<head>
...
</head>
<body>
<h1>DOM</h1>
<div id='main'>
<p name="p1">Le DOM trop top</p>
<p class="p2">DOM API</p>
</div>
<h2>Exemples</h2>
</body>
</html>
— Le DOM offre un ensemble de méthodes de parcours de l’arbre pour accéder et/ou mo-
difier son contenu
— ajouter des éléments
— supprimer des éléments
— ajouter et/ou modifier des attributs
— etc.
14.4.4 Utilité
— Modifier l’apparence
— Par exemple, changer dynamiquement le lien (attribut class) avec des définitions de
feuilles de style : interfaces réactives
— Exemple : masquage, démasquage des slides dans reveal.js, utilisé pour les diapos
projetées en CM
Pour l’utilisateur, on dirait que des actions graphiques sont effectuées à l’écran,
mais en fait, le code JavaScript effectue des modifications sur l’arbre DOM, et le
moteur de rendu du navigateur redessine la page, en appliquant le CSS, ce qui
crée les différences d’affichage.
JavaScript permet également de faire des choses au niveau de tout ce que sait
faire le navigateur, en vrai langage de programmation, indépendant d’une utilité
pour le Web.
On peut ainsi aller très loin, pour réaliser des choses très pointues : émuler un
système d’exploitation, virtualisé dans le navigateur, etc.
14.5.2 jQuery
https://jquery.com/
— Bibliothèque des plus populaires et des plus utilisées
— Utilisable avec tous les navigateurs pour un résultat identique (avant la standardisa-
tion)
Un peu ancien, et il y a sûrement mieux aujourd’hui… mais montré ici pour illustrer, pas
comme recommendation ultime.
Caractéristiques
— Slogan : « write less, do more » : écrire moins pour faire plus
— Facilité d’apprentissage
— Simplification de la programmation JavaScript
— Encapsulation des actions courantes dans des méthodes, ce qui réduit le code à écrire
— Simplification de certaines tâches comme la manipulation du DOM ou la programma-
tion AJAX
Fonctionnalités
— Accéder aux objets HTML/DOM
— Manipuler les styles CSS
— Gérer les évènements
— Réaliser des effets et des animations
— Programmer avec AJAX
— etc
jQuery dispose aussi d’extensions sous forme de plugins
Chargement de JQuery
— téléchargé depuis jQuery.com et inclus en local sur notre site
<head>
<script src="jquery-3.6.0.min.js"></script>
</head>
— ou référencer sur serveur de contenu externe, p. ex. sur CDN (Content Delivery Net-
work) jQuery
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js">
</script>
</head>
Programmation « événementielle »
1. Le navigateur (lui-même), ou les interactions de l’utilisateur déclenchent des événe-
ments
2. les événement déclenchent l’exécution d’actions sur les objets du programme (dont le
DOM).
Syntaxe de base
— Syntaxe de base jQuery :
$(selector).action(...)
Actions
— Actions immédiates : changer l’état d’un élément du DOM. Exemple :
$('#bouton1').click(function() {
// actions à faire lors d'un clic sur le bouton
//...
});
$(document).ready(function(){
// code jQuery...
});
14.6 AJAX
Cette section présente le modèle « AJAX » qui permet de mettre en œuvre des
applications JavaScript qui interagissent avec des services Web externes pour
récupérer des données, de façon asynchrone.
14.6.1 AJAX
Encore une fois, pas spécifique à XML : on peut charger ce qu’on veut sur le ser-
veur cible.
Les possibilité sont très nombreuses : à partir d’une page principale HTML, ren-
voyée une fois pour toutes par le serveur, et accompagnée d’un programme Ja-
vascript, on va pouvoir faire tourner une application complexe, qui se comporte
comme un client HTTP vis-à-vis de services Web divers, et agrégeant les don-
nées renvoyées par différents serveurs HTTP, les traitant et les visualisant.
Cette architecture est de plus en plus populaire.
Elle déporte la gestion des Vues et des Contrôleur de l’application très fortement
du côté du client, en comparaison de l’architecture traditionnelle qu’on voit dans
le modèle étudié en cours jusqu’ici.
Exemple
//...
$.ajax( {
url: "test.php",
error: function(resultat, statut, erreur) {
// ...
}
success: function(resultat, statut) {
// ...
}
} );
Take away
Postface
15 Séq. 9 : Gestion de la
sécurité, des erreurs
Cette section présente les enjeux généraux de sécurité qui s’imposent aux concepteurs
d’applications Web, avec un catalogue rapide de quelques problèmes courants.
15.1 Sécurité
15.1.1 Objectifs
Injection SQL
— Objectif : garantir que les requêtes SQL sont sans effet de bord
— Nettoyer les données servant à constituer ces requêtes SQL
Cf. http://php.net/manual/fr/security.database.sql-injection.php
— code PHP
<?php
$id = $_GET['id'];
$sql = "SELECT username
FROM users
WHERE id = $id";
...
— requête envoyée à :
http://localhost/?id=-1%20UNION%20SELECT%20password%20FROM%20users%20where%20id=1
— argument de la requête GET :
id : -1 UNION SELECT password FROM users where id=1
Exploits of a Mom (xkcd)
Cross Site Request Forgery (CSRF) Induire l’exécution de transition dans le graphe
d’états de l’application en jouant des requêtes à l’insu de l’utilisateur.
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
acct=olivier&amount=100
<?php
echo '<html>';
// ...
echo $_POST["name"];
<script>alert(42);</script>
<?php
echo '<html>';
// ...
echo htmlentities($_POST["name"]);
Résultat :
<html>
...
<script>alert(42);</script>
Sanitization
— Objectif : ne pas transmettre au Modèle des données avec des caractères indésirés
— Supprime de manière automatique les caractères indésirés,
— Champs des formulaires associés à un type de donnée pour restreindre les plages de
valeur
En plus, le développeur peut intégrer des règles de validation des données pour
éviter d’avoir des données incohérentes par rapport aux règles de gestion de
l’application
Cf. https://symfony.com/doc/current/validation.html
Source : https://reflectoring.io/complete-guide-to-csrf/
— Contrôle que la gestion de la soumission d’un formulaire suit immédiatement l’affi-
chage du formulaire
— Paramètre caché généré de manière automatique (_token en Symfony)
— Associé à une mémorisation du paramètre côté serveur (dans la session)
Construction du formulaire :
_csrf/post : "RfofubWU_auc33Mef-EdbvVlHOBh5J1561Z9rJ_FJ5I"
2. génération du formulaire envoyé au client
<form>
...
<input type="hidden" id="post__token"
name="post[_token]"
value="RfofubWU_auc33Mef-EdbvVlHOBh5J1561Z9rJ_FJ5I" />
</form>
if ($this->isCsrfTokenValid('token_id', $submittedToken)) {
// ...
}
Exemple : le profil d’un usager ne doit pas être accessibles par d’autres.
RGPD : Réglement Général (Européen) sur la Protection des Données
Contraintes : garder des traces du consentement au traitement des données
personnelles.
déjà vu
— BD : https://howhttps.works/
— Cf. LetsEncrypt, pour générer des certificats TLS.
Approfondir :
— https://phptherightway.com/#security
— Guidelines Web Security Mozilla
— OWASP Web Security Testing Guide
— Recommandations pour la sécurisation des sites web ANSSI
Cette section aborde la gestion des erreurs, notamment à travers l’utilisation des
exceptions.
15.2.2 Exceptions
try {
...
} catch (RequestException $e) {
...
}
15.2.6 Déployer
Checklists : https://symfony.com/doc/current/deployment.html
Cette section évoque l’enjeu de la qualité du code, qui permet de garantir que
l’application aura le fonctionnement attendu, et qu’ainsi, on évitera des pro-
blèmes de corruptions des données du modèle, ou de fuite d’infos, par exemple.
— Coder
— Tester
PHPUnit
Vraiment ?
Take Away
— sécurité de l’application :
— données entrées ou fournies
— sécurité des utilisateurs
— qualité du code
— le framework fait les choses « bien », et c’est tant mieux !
— ne plus programmer en PHP « basique » comme autrefois
Postface
Cette section présente succinctement des architectures plus récentes que l’archi-
tecture « classique » détaillée jusqu’alors, comme par exemple les technologies
de conception d’applications dans une page unique (Single Page Application).
Le serveur n’a plus qu’à gérer une API Web (Application Programming Inter-
face), sans aucune couche de présentation HTML.
Une seule « page Web » est chargée depuis un serveur, qui initialise toute une
application en chargeant et lançant du Javascript, qui s’exécute ensuite complè-
tement côté client.
PWA
— Fast !
— Mobile : résoud les pertes de connexion
— Fonctionne grâce aux Service Workers
Cf. Applications web progressives sur MDN
Service Workers A Service Worker is just a javascript file that runs in the background.
— Script (JS) tourne en tâche de fond
— Pas lié à une page Web
— Gestion des API du navigateur (connectivité, notifications…)
— thread séparée
— partagé entre des tabs
— « Proxy » entre l’application et le Web
Cf. Service Worker API sur MDN
16.2.3 WebAssembly
aka wasm
Langage bas niveau (« assembleur du Web ») plus efficace que JS
Plus sur : https://madewithwebassembly.com/
16.3 Décentralisation
16.3.1 Web3
Crypto, BlockChain…
Euh…
16.3.2 Fédiverse
— Mastodon : https://joinmastodon.org/
— PixelFed : https://pixelfed.org/
— PeerTube
— Mobilizon
— … (more at https://fediverse.party/ )
protocole clé : ActivityPub
16.3.3 Solid
16.3.4 …
Postface
— Diagramme Service Workers par David Novicki : “Work It” featuring Service Workers
17 Conclusion
Multi-couches
MVC principalement sur le serveur Contrôleur : Codé en PHP objet avec Symfony
Avantages :
— client (navigateur) stupide,
— formulaires câblés avec modèle de données Doctrine
— cohérence des interactions HATEOS gérées par le serveur
HATEOS : Hypermedia As The Engine Of application States
HTML statique
Formulaires standards
Figure 54 – « DHTML »
HTML dynamique
Figure 55 – « AJAX »
Programmation événementielle
— déclenchement programmes sur serveur : requêtes HTTP
— méthodes des classes PHP des Contrôleurs Symfony, réflexes cablés sur des routes
D’ailleurs, aussi sur le client :
— déclenchements de programmes dans le navigateur en Javascript, quand événements
interface utilisateur du navigateur (+ horloge, …)
— fonctions JS, câblés sur sélecteurs (DOM)
Dev vs Prod
env de tests serveur de tests local symfony server:start
production code déployé derrière Nginx, PHP-FPM, Cloud PaaS, etc.
Durée de vie
— Serveur Web : tourne en permanence
— Application :
— redémarrée à chaque requête entrante
— terminée après chaque réponse
— plusieurs fils d’exécution parallèles : requêtes HTTP de différents clients HTTP
Cohérence
— dans le temps entre deux requêtes du même clients (HATEOS) : sessions
— entre clients : base de données partagée, dans SGBDR
— Routeur + Contrôleur
— Doctrine (attributs ORM, repository)
— MapEntity (raccourci accès au chargement des objets depuis BD dans méthodes contrô-
leurs)
— Gabarits Twig
— *Type (FormBuilder + validation données)
— Exceptions
— Security
— rôles RBAC, permissions
— Session
— Cookies
Mais aussi
— Data fixtures
— Générateurs de code
Cette section aborde le déploiement d’une application Web, chose que l’on n’a
pas le temps d’expérimenter dans les TP de ce cours.
17.3 Approfondir
— Web : OK
— Reste problèmes applicatifs, conception
— Productivité (ex. formulaires Symfony)
— Qualité logicielle
— Tests automatisés (une fois codés)
La « suite » en CSC4102 !
17.5 Postface
18 Index
A O
accessibilité108 ORM29
ajax182
API195 P
authentification157 PaaS86
autorisation158 path()137
PHP16
B php -S88
bootstrap120 POST130
proximité115
C PWA195
captcha160
cascade115 R
CGI84 RBAC161
client-serveur69 repository36
code réponse73 requête69
contrôleur125 responsive114
cookie153, 155 ressource49
CRUD42, 72, 93, 129 REST128
CSRF187 Route137
CSS114 routeur137
D S
DevOps86 session154
doctrine29 Single page application195
DOM110, 178 SPA195
dump()102 stateless71
symfony102
E
T
en-tête74
templates97
exceptions191
toile48
F twig98
formulaire132
U
formulaires143
URL55, 61
G V
gabarits97 Vue94
GET73
W
H W3C64
HATEOS125 WCAG108
header74 www48
HTML96, 113
HTTP69, 71 X
HTTPS190 XMLHttpRequest182
hypertexte63 XSS187
I
identification157
injection SQL186
J
javascript114, 174
jquery180
208