Formation
PHP

Cédric BRASSEUR
Cédric BRASSEUR
- Ancien étudiant de l'Exia.cesi
- 4 ans consultant chez Amaris, placé chez Euro Information Dev
- Auto-entrepreneur depuis début 2020 (Création de sites web, applications mobiles & formateur, consulting DevOps, sécurité,...)
Et vous ?
- Nom, prénom
- Etudes réalisées
- Développeur depuis...
- Connaissances en PHP et SQL
- Autres infos appréciées

Plan du cours
Le cours est réalisé en trois parties :
- Partie 1 : Les bases du PHP
- Partie 2 : Sécurité et techniques avancées en PHP
- Partie 2.5 : Import de données avec PHP et MySQL & moteur de recherche
- Partie 3 : Introduction à l'orienté objet en PHP
Des exercices seront proposés tout au long de la formation.

Summary
Objectifs de la formation
- Apprendre à développer en PHP
- Appréhender les concepts de communication avec une base de données MySQL
- Réaliser des exercices, certains éducatifs, d'autres plus poussés ou adaptés aux besoins de l'entreprise des apprenants








Les bases de PHP
Création par Rasmus Lerdorf pour ses besoins personnels, avant d’être rendu public début 1995
Capacité de gérer les formulaires et d’accéder à la base mSQL
Version 3 de PHP
L’analyseur PHP est migré sur le moteur d’analyse Zend
La version 5 voit le jour
Sortie de la version 7
Version 8, sortie d'une nouvelle version majeure
1994
1995
1998
1995
2000
1995
2004
1995
2015
1995
2020
P
H
P
Le PHP dans les grandes lignes
- Web statique VS web dynamique
- Langage client VS langage serveur (script)
- S'exécute côté serveur (c'est pourquoi on va installer Wamp en local)
- Permet de réaliser des sites dynamiques
- Peut s'intégrer à du HTML facilement
- Langage objet ou procédural

Installation et paramétrage de Wamp server
L'installation devrait déjà être faite, nous allons uniquement vérifier ça et démarrer les services.
Pour vérifier, on va créer un script test.php dans le dossier wamp/www/formation-php (créez vous même le dossier formation-php).
Insérez le code "<?php echo "Hello world !"; ?>" dans ce script.
Ensuite, on va aller sur l'adresse
http://localhost/formation-php/test.php

Lien de téléchargement de Wamp (Windows)
Architecture d'une application web

Flux de fonctionnement (API)
HTTP Request
Demande du client à effectuer une action via le protocole HTTP

HTTP Response
Réponse formatée par le serveur pour retourner l'information voulue au client via HTTP
Les balises
Les balises servent à inclure du code php dans un script, sans balise, le code est compilé comme texte en sortie.
Plusieurs manières de faire, mais ayant la même finalité :

Les commentaires
Un commentaire n'est pas interprété dans le code, il permet uniquement d'expliquer dans le code ce que va réaliser le bloc de code suivant le commentaire.

Les variables
Une variable est un emplacement mémoire réservé pour y stocker des données qui peuvent varier au fil du temps

Explications sur les types de données
Les types principaux
Une variable contient un type de données, dont les principaux se trouvent ici

Démonstration
Premier script PHP intégré dans du HTML
Cet exercice sera très simple, on va simplement créer un script php qui affiche le contenu d'une variable.
Dans un premier temps, on va tous installer Wamp, Xamp, Lamp, selon votre OS.
Ensuite, nous allons créer un fichier variable.php dans le dossier www de wamp (sous Windows : C:/wamp64/www). Je vous conseil de créer un sous dossier "formation".
Dans ce fichier, on va mettre le contenu d'une page HTML classique en y intégrant un peu de PHP (https://www.w3schools.com/html/html_basic.asp)
Prenez le temps de réaliser l'exercice en même temps que la démonstration, n'hésitez pas à demander du temps pour l'installation de Wamp et ce premier script.
Navigateur
Il suffit d'aller sur l'adresse localhost associée à votre script, pour mon exemple précédent :
- http://localhost/formation-php/variables.php
Donnant le résultat suivant :
Script
Exécution de notre script
On se place à l'endroit où se trouve le script dans un invite de commande, pour ma part depuis VSCode et dans le dossier C:\wamp64\www\formation-php
Puis on exécute la commande suivante :
Donnant le résultat suivant :
php .\variables.php


Les opérations arithmétiques
Vous pouvez directement utiliser les opérateurs arithmétiques classiques pour réaliser des opérations en PHP.

Les opérations logiques et de comparaisons
Plusieurs opérateurs logiques vous seront utiles en développant en PHP : &&, ||, !bool,...
De même pour les opérateurs de comparaisons : ===, !== , >=, <=,...

Comparaison
Logique

Les conditions
Une condition permet de réaliser une opération ou une autre en fonction d'une comparaison dans le code.

Le switch
Un switch permet de réaliser plusieurs opérations en fonction de la valeur d'une variable, à l'instar d'une condition mais avec une syntaxe parfois plus adaptée en fonction du cas.

Exercice simple
Créer un petit programme PHP qui détermine si une personne est majeure ou mineure à partir de son âge.
- Créez une variable $age et assigne-lui une valeur numérique.
- Utilisez la condition pour vérifier si la personne est majeure (18 ans ou plus).
- Affichez dans la console :
- "Vous êtes majeur(e)." si la condition est vraie.
- "Vous êtes mineur(e)." sinon.
- Testez votre programme avec plusieurs valeurs de $age.
- (BONUS) : Ajoutez une variable $nom contenant une chaîne de caractères et qui sera également affichée dans le terminal.
Pour tester votre programme, vous pouvez directement utiliser la console en faisant php nomDeVotreScript.php
Les tableaux
Un tableau un type de donnée qui permet de variabiliser une succession de valeur (en général du même type)

Les tableaux
D'autres syntaxes existent pour l'utilisation / création de tableaux, voici quelques exemples :


Opérations sur les tableaux
De nombreuses opérations sont possibles avec les tableaux en PHP, nous allons en voir les principales

Les boucles
Une boucle est une instruction qui nous permet de parcourir tous les éléments d'une variable (tableau par exemple)

Les foreach
Un foreach fonctionne comme une boucle for vu précédemment, excepté qu'il ne nécessite pas d'ajout de compteur à l'itération.


$key est optionnelle !
break / continue
Ceci permet de contrôler les itérations que l'on veut parcourir, passer ou celles qui stoppent complètement le parcours.

Exercez-vous !
Prenez un peu de temps pour vous exercer avec les tableaux, tentez de réaliser ce que l'on a vu. Un tableau de couleurs par exemple.
Reprenez les slides précédentes pour :
- Créer des tableaux
- Manipuler des tableaux
- Réaliser les différentes opérations sur les tableaux
- Afficher avec une boucle (ou foreach) le contenu du tableau

Exercice intermédiaire
Envoyer le fichier guess_my_number_subject.md
Les fonctions natives PHP
Il existe de nombreuses fonctions PHP qui peuvent être utilisées nativement.
Quelques fonctions notables :
- empty
- isset
- unset
- var_dump
- print_r
- substr
- cast (type), strval, intval, boolval,...
- is_array, is_****
- htmlspecialchar
- ...
La gestion des dates
Plusieurs méthodes permettent de manipuler des dates avec PHP, nous allons en voir quelques-unes.

On reviendra sur cette slide plus tard ! La suite nécessite que vous ayez vu un peu de HTML / CSS
L'inclusion de fichiers
Afin de faire connaître le contenu d'un fichier et pouvoir en utiliser les fonctions, classes et autres objets, on doit inclure les fichiers.


La gestion des fichiers
Plusieurs fonctions permettent de gérer des fichiers en php, voici un exemple basique d'écriture / lecture de fichier.

Les fonctions
Créer ses propres fonctions vous permet de pouvoir réutiliser un même code à plusieurs endroit de votre script sans le copier coller. Pensez à l'inclusion de fichier pour utiliser des fonctions d'un autre fichier plutôt que les copier / coller dans votre autre fichier.

Utilisation de la documentation PHP
De nombreux exemples et informations sont présentes dans la documentation de PHP présente ici : https://www.php.net/manual/
Sur cette documentation, vous trouverez également toutes les fonctions natives de PHP avec des exemples de code commentés.
Vous pouvez également rechercher sur stackoverflow ou autres forums pour trouver d'autres personnes ayant fait face aux mêmes soucis que vous.
LA DOC ?
C'est réellement ce qui peut vous sauver des heures de recherches inutiles, prenez le reflexe !
Exercice
Exercice (Réaliser une calculatrice en PHP)
Le but de l'exercice est de vous laisser du temps pour que vous réalisiez une calculatrice dans une page php / html, cette fois-ci, il vous faut un peu de HTML pour l'afficher sur une page. Si besoin je peux vous envoyer un template et vous expliquer comment ça fonctionne.
Pensez à vérifier les input utilisateurs avec is_numeric.
Les opérations voulues (sous formes fonctions) sont :
- Addition,
- Soustraction,
- Multiplication,
- Division.
Le résultat doit apparaître sur la page.
N'hésitez pas si vous avez besoin d'aide.
Traitements chaînes
Les chaînes de caractères ont souvent besoin d'être manipulées, voici quelques exemples

Traitements dates
Les dates ont souvent besoin d'être manipulées, voici quelques exemples

Exercice PHP
Exercice en 5 étapes :
- Affichez, grâce à une fonction native et la concaténation de chaînes, la date dans ce format : "Nous sommes le 09/06/2021" (9 Juin).
Puis ajoutez 30 jours à cette date avant de l'afficher à nouveau. - Créez une fonction qui permet de vérifier si une chaîne de caractères passée en paramètre contient au moins 5 caractères
- Créez une fonction qui permet de vérifier si une chaîne de caractères passée en paramètre commence par une voyelle
- Créez une fonction qui permet de créer un fichier en y ajoutant la chaine de caractères passée en paramètre
- Créez une fonction qui permet d'exécuter toutes les fonctions créées précédemment
Post
Envoi des données par script d'une page à l'autre, ces données sont ensuite vérifiables et exploitables
Get
Principe des formulaires
Envoi des données par url d'une page à l'autre, ces données peuvent également ensuite être vérifiées et exploitées
Envoi et traitement de données
Un fichier contenant le formulaire (html) et le type d'action du formulaire et un fichier script (php) de traitement des données !


HTML
PHP
Le HTML et les formulaires
Nous allons voir un exemple assez complet de formulaire en HTML, ceci vous permettra d'avoir une base pour les exercices qui suivent.

HTML
Post
Un exemple très simplifié d'un formulaire en POST :


Get
Un exemple très simplifié d'un formulaire en GET:


Validation et traitement des formulaires
Il est important de valider les informations qui transitent par vos formulaires car elles proviennent directement de l'utilisateur.
Voici un exemple de contrôle de données. (Avant que vous mettiez en pratique sur un cas concret)

Envoi et contrôle de fichier par formulaire
Comme vu dans la partie formulaire et HTML, il est possible d'envoyer des fichiers par un formulaire. Mais il est nécessaire de les contrôler, nous allons voir quelques étapes

Exercice intermédiaire
Ecrire un script php, contenant le html proposé permettant d'avoir deux input : email et password.
Ouvrez vos balises php en dessous, écrivez les étapes de :
-
Vérification de la présence des deux input dans $_POST avec isset et une condition if
- Vérification de l'email et du mot de passe (chaîne dans une variable en dur dans votre script, $email = 'test@example.com'; $password='password';)
- Retour d'un message sur la page précisant les erreurs potentielles si les vérifications précédentes ont échouées
Pas besoin de fonctions, mais vous pouvez si vous le souhaitez
Exercice
Atelier (fil rouge) - Création d'un formulaire permettant l'envoi et la mise en forme d'articles :
Vous devez réaliser un formulaire pour créer des articles, chaque article doit contenir :
- Titre (string) (5 caractères mini)
- Auteur (string) (Contient au moins un espace)
- Contenu(texte)
- Date de parution (date) (inférieure à la date du jour)
- Couverture (jpg, png) (taille inférieur à 4Mo)
- Est public (booléen)
Dans un premier temps, la création d'un article doit être contrôlée sur chaque valeur (existence, taille, cohérence de valeur,...) ensuite, la photo doit être contrôlée (jpg/png) et stockée dans un dossier. Pensez à afficher les éventuelles raisons d'erreurs.
Optionnel : Pour finir, réalisez l'affichage de cet article s'il a correctement été passé.
Les bases de données
Base de données
-
Structure permettant d'agencer et de sauvegarder des données relatives à un ou plusieurs projets
-
Cette structure peut être relationnelle ou non (SGBD =/= SGBDR)
-
Les données doivent être protégées mais accessibles en continue
-
Nous allons utiliser PhpMyAdmin (inclus avec Wamp)

BDD
SQL introduction
-
Langage de communication avec une base de données,
-
Découle en général du modèle MERISE,
-
Opérations CRUD (Create, Read, Update, Delete)
-
Le T-SQL (ou PL-SQL) permettant le SQL Avancé et les opérations plus complexes.
- Nous allons utiliser MySQL

SQL
Lexique

- Base de données
- Table
- Champ
- Enregistrement
- Donnée
- Requête SQL
- SGBD (SGBDR)
Démonstration
Démonstration de PhpMyAdmin avec Wamp et utilisation de MySQL
PhpMyAdmin
&
MySQL

Identifiant (par défaut) : root
mot de passe (par défaut) : (vide)
Création d'une nouvelle base de données
On va commencer par créer une base de données. Rien de plus simple pour l'instant.
CREATE DATABASE php_formation;
Création d'une nouvelle table
Ensuite, on va se placer sur cette base depuis phpymyadmin et on va créer une table. L'exemple ressemble beaucoup au besoin pour l'exercice de fin de chapitre.
CREATE TABLE articles (
id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
titre varchar(50) NOT NULL,
contenu varchar(300) NOT NULL,
date_parution date,
couverture blob,
est_public bit NOT NULL
)
PRIMARY KEY : identifiant unique auto-incrémenté par le SGBD
CRUD et opérations basiques
Nous allons voir ensemble plusieurs opérations possibles sur cette table.
C
R
U
D
reate : Création de nouveaux éléments dans la BDD
ead : Lecture d'éléments dans la BDD
pdate : Modification dans la BDD
elete : Suppression dans la BDD
Clé primaire / Clé étrangère
La clé primaire étant le champ qui permet de rendre unique chaque champ d'une table, la clé étrangère est la référence à cette clé dans une autre table. Prenons l'exemple de la table article, on souhaite lier un article à un auteur (nom, prénom, date de naissance).
CREATE TABLE auteurs (
id int PRIMARY KEY AUTO_INCREMENT,
nom varchar(50) NOT NULL,
prenom varchar(50) NOT NULL,
date_naissance date
)
ALTER TABLE articles
ADD auteur_id INT;
ALTER TABLE articles ADD CONSTRAINT FOREIGN KEY (auteur_id)
REFERENCES auteurs(id);
Table auteur
Clé étrangère ajoutée à articles
Auteur |
---|
id |
... |
Articles |
---|
id |
auteur_id |
... |
Jointure et relations
Une jointure permet de lier les données d'une table à une autre grâce à la relation de clé primaire / clé étrangère.
Nous allons voir qu'une seule jointure, mais si ça vous intéresse on peut prendre de voir les deux autres les plus courantes.
Jointure interne (présence de clé étrangère obligatoire pour avoir un retour (NOT NULL))
SELECT *
FROM articles ar
INNER JOIN auteurs au ON ar.auteur_id = au.id
Utilisation de la documentation SQL
Comme pour PHP, vous pouvez vous référer à la documentation SQL afin de trouver des exemples ou la syntaxe pour réaliser les opérations voulues. Nous en avons vu quelques exemples, mais les cas de requêtage en SQL sont presque illimités.
Voici le lien de la documentation : https://sql.sh/
LA DOC ?
C'est réellement ce qui peut vous sauver des heures de recherches inutiles, prenez le reflexe également pour le SQL !
MYSQLi : Faire du SQL avec PHP
-
Une méthode de connexion à la base de données pour pouvoir communiquer avec elle depuis PHP
-
Paramétrage de la connexion (localhost)
-
Requêtage directement en SQL
-
Récupération des résultats
-
Plusieurs opérations possibles (CRUD)
-
Requêtes préparées (plus sécurisées)

On pourrait aussi utiliser PDO !
Paramétrage de la connexion
mysqli_connect(hote, user, password, dbName, port, socket);

- hote : Nom (ou IP) de l'hôte de connexion
- user : Nom de l'utilisateur
- password : Mot de passe de l'utilisateur
- dbName : Nom de la base de données
- port : Numéro du port
- socket : Socket concerné (optionnel)
La connexion se ferme automatiquement à la fin d'exécution du script, mais vous pouvez utiliser mysqli_close($connexion); pour la fermer explicitement.
Paramétrage de la connexion
<?php
function connectDB() {
$hostname = 'localhost';
$username = 'root';
$password = '';
$database = 'users';
$port = 3306; // A remplacer par le port utilisé par MySQL 3306 est le port par défaut
$connexion = mysqli_connect($hostname, $username, $password, $database, $port);
if ($connexion->connect_error) {
die('Connexion échouée : ' . $connexion->connect_error . '<br/>');
} else {
echo 'Connexion réussie' . '<br/>';
}
return $connexion;
}
?>
Un exemple complet de connexion avec mysqli_connect
Paramétrage de la connexion
<?php
require_once("connexion.php");
function getUser($login, $password) {
$conn = connectDB();
if ($conn) {
// La connexion s'est bien passé, vous pouvez faire votre requête en BDD
// La requête se fait via $conn
} else {
// La connexion s'est mal passée
}
}
?>
Appel de cet fonction depuis une autre page (celle de la requête)
Non préparée
Méthodes associées :
- mysqli_num_rows
- mysqli_fetch_all
- mysqli_fetch_row
- mysqli_fetch_object
- mysqli_fetch_array
Nous allons voir un exemple ensemble
Préparée
Requêtes de sélection
Méthodes associées :
- mysqli_prepare
- mysqli_stmt_bind_param
- mysqli_stmt_bind_result
- mysqli_stmt_execute
- mysqli_stmt_num_rows
- mysqli_stmt_fetch
- mysqli_fetch_assoc
Nous allons voir un exemple ensemble
$result = mysqli_query($connexion, "SQL QUERY");
$rows = mysqli_fetch_all($result);
$req = mysqli_prepare($connexion, $sql);
mysqli_stmt_bind_param($req, 'ds', $id, $plate);
mysqli_stmt_bind_result($req, $reference, $model);
$result = mysqli_stmt_execute($req);
Non préparée
Méthodes associées :
- mysqli_query
- mysli_affected_rows
- mysqli_insert_id
Nous allons voir un exemple ensemble
Préparée
Requêtes de mise à jour
Méthodes associées :
- mysqli_prepare
- mysqli_stmt_bind_param
- mysqli_stmt_execute
- mysqli_stmt_insert_id
Nous allons voir un exemple ensemble
$result = mysqli_query($connexion, "SQL QUERY");
$insertedId = mysqli_insert_id($connexion);
$request = mysqli_prepare($connexion, "SQL QUERY");
mysqli_stmt_bind_param($request, "dd", $hotel, $model);
$result = mysqli_stmt_execute($request);
mysqli_stmt_insert_id($request);
Workshop intermédiaire
Pour ce workshop votre objectif est de réaliser une authentification utilisateur et vous assurer qu'il soit bien connecté en mettant en session les infos si l'utilisateur est bien connecté.
- Créer le script SQL avec une base et une table utilisateur (login, mdp) + Insérer au moins une donnée
- Créer un formulaire d'authentification avec un champ login et un champ mot de passe
- Créer une page accessible uniquement si 'is_connected' en session est bien setté, vous devez donc vérifier le retour de la requête SQL avec les informations de l'utilisateur puis mettre en $_SESSION['is_connected'] si l'utilisateur est connecté ou non. Utilisation de header("location:autre_page.php") pour aller sur cette page.
- Affichage sur cette page "Vous êtes connecté", ou "Vous n'êtes pas connecté, veuillez d'abord vous identifier"
- Ajoutez sur cette page un lien vers page la page d'authentification.
Workshop intermédiaire
Compléter ce workshop avec :
-
Un formulaire d'ajout d'un nouvel utilisateur (login + mot de passe). Pas de vérification nécessaire, seuls les champs login et mot de passe doivent être bien passé en $_POST et ne doivent pas être vide (isset + !empty).
Une insertion en base doit être effectuée par la suite dans la table utilisateur
- La modification du mot de passe d'un utilisateur via son son login, deux possibilités, soit vous réalisez la requête de modification en demandant login et mot de passe à l'utilisateur, soit vous passez par deux variables en $_GET qui proviennent de l'ULR et qui permettent de modifier directement l'élément concerné.
(Vérifier d'abord si le login / mot de passe est bien existant en base de données puis modifier le mot de passe)
MYSQLi : à vous !
Atelier : Reprendre le travail effectué pour la fin de la partie précédente (articles de blog). L'objectif est de permettre le stockage, l'ajout, la modification ou la suppression d'articles en base de données.
Il nous faut donc une fonction de récupération des articles, une fonction pour créer un article, une fonction pour modifier un article, une fonction pour supprimer un article.
1. Il va aussi être nécessaire de gérer des auteurs, nous n'allons qu'en gérer l'ajout. (Faire un nouveau formulaire auteur.php action vers auteur.php et require('ajout_auteur.php') pour appeler la fonction d'insertion (valider les données + insertion en base))
Côté BDD : Les deux tables créées précédemment suffisent pour l'instant (articles & auteurs). Il nous faut la connexion à la BDD.
Pour l'instant, le plus simple serait de créer une page .php par fonction avec chacun son formulaire (et des liens rapide pour aller vers les autres pages .php avec un lien <a href="lien/script_update.php"> Modifier </a>)
Stockage de données
Session & cookies
Côté serveur (session)
- Le terme "session" désigne la période de temps correspondant à la navigation continue d’un utilisateur sur un site
- Utilisateur authentifié (anonyme ou non)
- Stockage de données dans la session
- Persistance de données temporaires
Côté client (cookie)
Stockage temporaire
- Le cookie est un fichier qui est présent côté client
- Ce cookie reste jusqu'à ce que l'utilisateur le supprime (ou il a une durée de vie maximum)
- Renvoyé automatiquement par le navigateur sur le serveur
- Persistance de données temporaire et altérable par le client
Authentification
Afin de stocker des informations, il est au préalable nécessaire d'authentifier l'utilisateur. Plusieurs méthodes sont possibles, nous ne verrons que celle par un formulaire et renseigné dans la session (et non l'authentification par header http)


Les cookies
Utilisation de setcookie pour créer un cookie côté client et pouvoir le récupérer pour valider l'authentification sur une autre page


Les sessions
Quelques méthodes pour vous aider à gérer les sessions :

Les sessions
Un exemple plus concret en relation avec ce que l'on a fait juste avant avec les cookies. Déjà démarrons notre session :

Les sessions
Ensuite, nous pouvons utiliser la session pour gérer notre authentification :


Exercice
Mettez en application ce que l'on vient de voir avec les sessions :
- Réalisez un formulaire en POST, le but est d'ajouter dans un tableau d'éléments crées par ce formulaire (exemple, un tableau contenant un input de nom uniquement). Les éléments seront gardés en sessions et donc ajoutés au fur et à mesure au tableau dans la session.
- On démarre la session, on y créer un tableau dans lequel on va ajouter les éléments envoyés par le formulaire au fur et à mesure
- On affiche le contenu de ce tableau dans une autre page (header('location:autre_page.php'); (Cette page doit également démarrer la session pour y avoir accès)
Mettre en place une API en PHP
Flux de fonctionnement (rappel)
HTTP Request
Demande du client à effectuer une action via le protocole HTTP

HTTP Response
Réponse formatée par le serveur pour retourner l'information voulue au client via HTTP
Les api - REST
Representational State Transfer
De manière générale, le Web est composé de REST (états et fonctionnalités basées sur des appels d'URL).
Nous allons mettre en place une API REST from scratch (de zéro) en PHP.
GET
HEAD
PUT
DELETE
POST
OPTIONS
Récupération d'un contenu
Comme GET mais pour le header (méta)
Mise à jour de contenu
Ajout de contenu
Suppression de contenu
Retourne les ressources disponibles
Les api - REST
Pourquoi mettre en place une API ?
Nous utilisons des API REST afin de réaliser des endpoints. Ces endpoints ont chacun leur objectif, comme vu dans la slide précédente. Souvent, ils permettent de réaliser des opérations CRUD sur des données en base de données par exemple (nous le ferons en JSON)
A noter qu'il est nécessaire de bien contrôler les demandes qui sont réalisées sur cet API. Très souvent, nous utilisons un framework pour les réaliser, mais dans notre exemple, nous allons la réaliser de zéro pour bien comprendre comment ça fonctionne en PHP.
Dans une slide suivante, nous rajouterons une notion importante de gestion des droits que l'on appliquera pas car il est encore trop tôt pour réaliser une API complète avec gestion des droits et d'authentification.
Les api - REST
Les étapes de mise en place
- Installer PHP et mettre en place un serveur web (Apache par exemple)
- Définir les endpoints pour votre API. Un endpoint est une URL spécifique qui va répondre à une requête particulière.
- Ecrire le code pour chaque endpoint. Il faut donc gérer la requête HTTP et les entrées utilisateur et envoyer un message de retour adéquate. Nous allons utiliser le format JSON comme vu précédemment. (avec les méthodes file_get_contents() & file_put_contents().
- Tester votre API ! Vous pouvez utiliser des outils comme Postman ou Thunderstorm (plugin VS Code) pour envoyer les requêtes ou directement en requête CURL (voir slide suivantes)
- Documenter votre API ! Il est nécessaire de réaliser une documentation claire sur les requêtes possibles et les retours en fonction des demandes.
Les api - REST
Utilisation de la commande curl
curl est une commande simple permettant d'appeler des URL en REST, cette commande vous permettra de communiquer avec l'API REST proposée par couchdb et donc travailler sur votre base de données.
curl http://localhost:5984/

Conseillé sous Unix
Documentation
Les api - REST
Utilisation de Postman
Postman est un outil de requêtage REST très pratique.
Conseillé sous Windows

Il permet de faire tout type de requêtes, il est possible de passer des paramètres pour nos requêtes POST ou même gérer l'authentification (non nécessaire pour nos exemples)

Les api - REST
Explications du code nécessaire
Je fais exprès de faire des captures et expliquer étapes par étape pour éviter de faire un simple copier / coller, mais je vous donnerai accès au code complet après l'exercice.
La variable $_SERVER

Voici comment mettre en place un endpoint en GET, accessible via
Pour connaître le contenu utile de la variable $_SERVER, vous pouvez utiliser print_r($_SERVER).
Un simple endpoint en GET
Les api - REST
Explications du code nécessaire
Un endpoint en POST

Le else pour les endpoints non existants
Ici le endpoint est un endpoint en POST, il nécessite des inputs qui devront être contrôlées
Ici, on dit que si le endpoint n'est pas connu des if / else if, la requête n'est pas connue et on renvoie une not found (code 404)

Les api - REST
Explications du code nécessaire
Les retours d'un endpoint

Ceci est un retour avec header de type json afin de renvoyer des données trouvées.
header permet de formater le type de retour pour un format json par exemple (ou html ou xml ...)

Ceci est un retour remontant une bad request, c'est souvent utilisé lorsque des paramètres sont manquants ou ne correspondent pas à une clé existante
Les api - REST
Explications du code nécessaire
La gestion des entrées utilisateurs ($_GET)
Ici, nous vérifions que le paramètre $_GET est présent dans la requête effectuée. C'est un contrôle d'entrée utilisateur nécessaire pour un endpoint (s'il entrée utilisateur il y a).
Un paramètre $_GET est passé via l'url :

Les api - REST
Explications du code nécessaire
La gestion des entrées utilisateurs ($_POST)
Ici, on récupère dans un tableau $data les éléments qui sont passés dans le body de la requête.
Un paramètre POST est passé via la request (en json souvent)


Les api - REST
Explications du code nécessaire
Un exemple de endpoint complet

Les api - REST
Explications du code nécessaire
Petite démonstration du code & l'utilisation pour les endpoints
Les api - REST
Exercice d'application
Cet exercice a pour objectif de mettre en place une API REST qui va proposer des endpoints pour gérer des profils utilisateurs (nom, prénom, âge) stockés dans un fichier json.
- Ajout : Requête POST avec 3 entrées en JSON. Cette requête doit vérifier que les 3 entrées sont présentes et que l'âge est bien un entier.
- Lecture : Requête GET sans paramètre pour lire l'intégralité du fichier
- Lecture : Requête GET avec un paramètre en GET pour lire une donnée en particulier
- Modification : Requête PUT avec 3 entrées en JSON. Cette requête doit vérifier que les 3 entrées sont présentes et que l'âge est bien un entier ainsi que vérifier que le nom passé est bien existant
- Suppression : Requête DELETE qui supprime tout le contenu et remplace le contenu d'un fichier par un tableau vide [].
Envoyer workshop API
Pour aller plus loin...
APIs
- Les APIs sont de plus en plus utilisées depuis que l'on tend à utiliser des systèmes décentralisés
- Une API doit être sécurisée, testée et intégrée en continue
- Une API peut utiliser un Framework (dans l'idéal, sécurisé)
- Une API doit toujours être disponible
- Les données transitant par une API doivent être contrôlées
Frameworks
- L'utilisation d'un Framework a de nombreux avantages en matière de sécurité :
- Faciliter la gestion des droits et rôles,
- Logger à votre place,
- Sécuriser le nombre d'appels
- Sécuriser les données sensibles,...
- Mais il faut s'assurer d'utiliser un Framework sécurisé et maintenu ! Sinon, vous n'avez pas la main pour corriger une éventuelle faille.

La sécurité des APIs
Gestion des sessions
Pour réaliser des opérations sécurisées sur vos APIs, il vous faut pouvoir authentifier et maintenir les sessions de vos utilisateurs. Le maintient de la session est à considérer comme temporaire.
On recharge la session régulièrement et surtout on recharge la session avant une opération critique !
(même si l'idéal est d'éviter qu'un utilisateur lambda puisse réaliser une opération critique sur votre API)



Identifier les données sensibles
-
Cloisonnement des environnements : Et sécurisation des variables de configuration
-
Sécurisation des clés d'APIs "Secrets" : Utilisation de clé différentes pour l'environnement de test et sécurisation maximale de celle de l'environnement de production. (Exemple Stripe !)
-
Données sensibles : CB, mots de passes,...
- Hachage efficace : Utiliser le hachage pour sécuriser vos données

RGPD
Gestion des erreurs
- Gestion cohérente des erreurs dans votre API (code retour, message, type d'erreur,...)
- Journalisation des erreurs (logs)
- Intercepter les erreurs et les traiter
- Alerter en continue (lors du déploiement continue)
Gestion de la mémoire
- Gestion de la mémoire souvent oubliée dans la sécurité
- Souvent géré directement par le Framework (Garbage collector)
- Très impactant dans d'anciens langages tels que le C ou le Cobol
- Superviser la consommation mémoire en continue
Vérification des entrées / sorties
Vérifier les entrées utilisateurs !
N'importe qui peut modifier le payload, c'est à vous de vous assurer de la cohérence des données qui vont pouvoir atteindre votre base.

Vérifier la présence d'une authentification
En étant en invité, l'utilisateur ne devrait uniquement que pouvoir créer un compte et lire les données accessibles aux visiteurs.
Encoder les données avant retour
Des données encodées sont des données qui, si elles peuvent être intercéptées, ne pourront pas être lues sans l'opération de décryptage.


Contrôler l'accès
Vos APIs doivent gérer les droits et utilisateurs également. Ceci vous permettra de bien vérifier qui accède à quoi et surtout contrôler les accès de chaque utilisateur (ou pour chaque rôle).
Le nombre d'appels maximum à votre API est également à contrôler.
L'utilisation de Framework est conseillée mais pas obligatoire. Ce dernier peut directement intégrer la gestion des droits. Prenons un exemple avec Directus.
Utilisateur
Rôle(s)
Droits
Authentification
Authorisations


Sécurité et opérations spécifiques en PHP
Injection SQL
Utilisation d'une entrée utilisateur non protégée pour modifier le comportement de la requête SQL derrière l'action à effectuer.

Parades :
- Utilisation de requêtes préparées,
- Utilisation d'un framework sécurisé,
- Utilisation de méthodes d'assainissement (ou d'échappement)
Introduction au top 10 OWASP
Tutoriel interactif (Checkmarx)
Rendez-vous sur
https://free.codebashing.com/courses/php
Suivez les 3 leçons gratuites en PHP. Il y'a normalement 24 minutes de tuto, je vous laisse 30 minutes au cas où vous voulez regarder plusieurs langages.
Exercice
Atelier : Mise en place d'une création de compte utilisateur (admin pour l'instant), une connexion avec vérification de mot de passe (pour l'instant non crypté) et forcer la connexion pour pouvoir accéder aux formulaires de gestion des articles.
Vous allez créer une nouvelle table "utilisateur" avec un email et un mot de passe uniquement pour l'instant. On va ajouter un formulaire de création d'utilisateur et un formulaire de connexion avec vérification en base de données.
Ensuite, vous pouvez simplement créer un élément en session pour valider que l'utilisateur est connecté et donc forcer la connexion sur la page contenant les actions.
Profitez-en pour faire des requêtes préparées, comme vu précédemment. (Eviter les injections SQL)
Formatage de données
PHP permet d'utiliser des expressions régulières pour formater des chaînes de caractères, voici quelques exemples (les explications sont dans la slide suivante)

Formatage de données

Exemples de directives :
La gestion des erreurs
Configuration (php.ini) et fichier de log contenant les erreurs php. Ceci est directement accessible depuis wamp.
Premièrement, vous devez activer l'affichage d'erreurs dans le fichier php.ini, une variable display_errors doit être mise à On, pour ma part celle ci se trouve ligne 474.
Ensuite, vous pouvez consulter le fichier php_error.logs contenant les logs et des informations lorsqu'une erreur intervient dans un script.
La gestion des erreurs
Il est possible de gérer les erreurs directement dans vos scripts PHP. Ceci grâce aux instructions try {} catch {} finally {}.
Voici un exemple très simpliste.

La gestion des erreurs
Vous pouvez également vous même anticiper les erreurs et les renvoyer à votre guise grâce à l'instruction throw.

La gestion des erreurs
L'idéal est de stocker les erreurs dans un fichier de log ou même directement en base de données, vous pouvez réaliser une fonction de log afin de l'utiliser dans vos catch et logger chaque exception avant de la renvoyer à l'interface (client)

La gestion des erreurs
Voici la liste des types d'exception en PHP ainsi que leur arborescence :

Exercice
Atelier : Ajouter une gestion des erreurs cohérente pour votre blog.
Ceci incluant :
La création d'un compte utilisateur (vérification des données d'entrée)La connexion d'un utilisateurLa gestion des articles (Création / Modification / Lecture / Suppression)La vérification de la présence de l'élément de connexion en session pour vérifier que l'utilisateur est connecté
Exercice
Atelier : Ajouter une gestion des erreurs cohérente pour votre formulaire d'articles
-
Si une des entrées utilisateur ne correspond pas aux critères, levez une Exception.
- Par exemple, si le titre contient moins de 5 caractères, levez une Exception (avec throw new Exception) plutôt que faire un echo.
- De même pour les autres vérifications à réaliser (auteur, date, taille de fichier, extension de fichier,...)
- Dans votre bloc catch, créer un fichier qui contient les exceptions (Avec file_put_contents() et l'option FILE_APPEND)
Envoyer un mail
PHP permet de gérer les mails via la fonction native mail(). Nous allons voir un exemple simple et un exemple MIME. Ceci n'empêche pas de devoir configurer un serveur mail en local.
Dans un premier temps : Configuration d'un serveur mail en local. Nous allons utiliser sendmail (https://www.glob.com.au/sendmail/)
On va récupérer le zip et le dezipper sous C:/wamp64/.
Il nous faut modifier le fichier sendmail.ini pour configurer notre serveur smtp (mailtrap.io par exemple)
Ensuite, ouvrons le php.ini et modifions la ligne 1080:
sendmail_path = "C:\wamp64\sendmail\sendmail.exe"
Puis nous allons redémarrer wamp.
Envoyer un mail
Utilisation de la fonction mail() associée à un formulaire simple:

Envoyer un mail
Utilisation de la fonction mail() associée à un contenu de mail riche :

XML et PHP
Le XML est une structure de stockage de données qui peut être gérée en PHP, pour la création, la lecture ou la modification d'un fichier XML depuis PHP. Nous allons voir uniquement la lecture.

JSON et PHP
De même pour lire le JSON :



JSON et PHP
De même pour écrire du JSON :


La structure JSON
{
"premierNoeudTableauObject": [
{
"premierObjet" : {
"nom": "BRASSEUR",
"prenom": "Cédric",
},
},
{
"secondObjet" : {
"nom": "JEAN",
"prenom": "Sébastien",
},
},
],
"secondNoeudSimpleValeur" : 10,
},

Le JSON permet de stocker des données comme on le souhaite, sous forme de tableaux, d'objets ou de simple association
clé => valeur
Avantages
- Lecture rapide et efficace sans accès réseau (potentiellement)
- Format lisible par n'importe quel être humain et n'importe quelle machine (OS)
- Utilisable nativement avec un grand nombre de technologies
- Stockage de différents types de données
- Syntaxe simple et efficace
Inconvénients
JSON (très utilisé en NoSQL)
- Il faut sécuriser soit même les données sensibles
- Pas d'identification précise des données (sous forme de balise par exemple), la structure doit donc être connue avant utilisation.
- Une erreur de code peut vite détruire l'intégrité de vos données
JSON et PHP
Démo live par le formateur
CSV et PHP
Lecture d'un fichier csv pour récupérer les données dans un tableau en PHP:


Workshop import de données
Envoyer le sujet du workshop.
Ce workshop a pour objectif d'appréhender correctement l'import de données depuis des fichiers csv (en .txt) vers une base de données MySQL.
L'exercice va prendre un certain temps, n'hésitez pas à me demander de l'aide si vous êtes bloqués, j'ai essayé d'être le plus précis possible dans les commentaires sur le sujet.
Bon courage !
Workshop format JSON
Envoyer le sujet du workshop.
Ce workshop a pour objectif d'appréhender correctement l'utilisation du format JSON en tant que données exploitables (CRUD).
L'exercice va prendre un certain temps, n'hésitez pas à me demander de l'aide si vous êtes bloqués, j'ai essayé d'être le plus précis possible dans les commentaires sur le sujet.
Bon courage !
Cron
Création d'une tâche cron pour lancer notre script php.

Ou directement avec le planificateur de tâche de Windows.
Doc Unix
Moteur de recherche
Il est possible de réaliser un moteur de recherche dans une base de données grâce à PHP, mais surtout grâce à votre requête SQL.
Voici un exemple classique sur la table articles :

Moteur de recherche
Précisions:
- Un SGBDR n'est pas le plus adapté pour des données volumineuses et / où sur tous les champs d'une table.
- Le NoSQL et le Big Data répondrait plus à ce besoin.
- Plus le nombre de champs est conséquent et plus la quantité de données est conséquente, plus la recherche sera longue
- Attention aux champs et leurs types pour votre recherche
Aparté sur ElasticSearch: C'est un outil (qui peut être intégré à PHP) permettant de réaliser plus facilement ce type d'opérations de recherche directement dans le contenu de fichiers. Ceci pourrait éviter l'import de données et grandement accélérer vos recherches.
Exercice
Réaliser un moteur de recherche sur toutes les tables de la base de données.
Un formulaire contenant les différents input de recherche ainsi que les options de recherche (Commence par, Termine par, Contient).
L'objectif est de rechercher dans toutes les tables, à votre convenance, soit 3 UNION, soit les jointures (conseillé) grâce à notre requête SQL.
Début d'après-midi :
La finalité sera d'afficher les informations importantes des éléments trouvés.
Exemple d'intégration de PHP avec HTML, CSS et Javascript
Nous allons directement voir un exemple de code accessible sur github
(dans CorrectedExercice /Workshop/Partie4)
L'orienté objet
Programmation Orienté Objet
-
Création de classes : Structure contenant des propriétés et des méthodes qui lui sont propres. C'est un modèle qui est défini pour un futur objet.
-
Instanciation d'objets : Permet de créer des objets respectant le modèle de la classe.
- Constructeurs : Permet de gérer la ou les façons dont les objets sont créés.

POO
Les classes
Une classe est une structure contenant des propriétés et des méthodes qui lui sont propres. C'est un modèle.

Les propriétés
Une propriété est une variable rendu disponible dans la classe.

Le constructeur
Un (ou plusieurs) constructeur permet de réaliser des opérations et spécifier la création d'un objet. On l'utilise très fréquemment pour valoriser les propriétés d'une classe.

Le destructeur
Un destructeur permet de réaliser une action particulière lors de la destruction de l'objet (soit manuelle, soit automatiquement à la fin d'un script).

Les méthodes
Les méthodes sont l'équivalent d'une fonction que l'on a déjà vu, mais elle sera propre a l'objet, en général elle permet de réaliser des opérations avec les propriétés de l'objet.

L'instanciation d'un objet
Permet de créer un ou plusieurs objets respectant le modèle.

Exercice
Définir une classe "User" ayant pour propriétés :
- $name (Le nom de l'utilisateur)
- $firstname (Le prénom de l'utilisateur)
- $language (La langue de l'utilisateur)
- $timestamp (La date de création de l'objet)
Ajoutez un constructeur permettant de valoriser $name, $firstname et $language. De plus initialiser le timestamp avec un time();
Ajoutez ensuite deux fonctions :
- La première donne des informations de l'utilisateur dans un echo ,
- La seconde permet de changer la langue de l'utilisateur.
Faites un destructeur qui affiche que l'objet est détruit.
Instanciez un objet et utilisez les méthodes créées précédemment.
L'héritage
L'héritage permet de partager des propriétés et méthodes entre les classes, il suffit d'utiliser le mot clé extends pour que cette classe (fille) hérite de la classe de base (mère).
Le partage de code s'effectue de manière descendante uniquement.
L'héritage (code)

L'interface
Une interface est un contrat a respecter, il défini la signature des méthodes (définition de méthode sans leur implémentation) qui doivent être implémentées dans les classes respectant ce contrat d'interface.

Les classes abstraites
Une classe abstraite (mère) permet de définir les signatures des méthodes et les propriétés qui seront partagés à la classe qui va étendre cette classe abstraite (fille)

Le mot clé static
Le mot clé static permet de ne pas avoir à instancier une classe pour en utiliser une propriété statique ou une méthode statique.

Exercice
PARTIE 1 :
Ecrire une classe pour modéliser un Author (Auteur).
Propriétés :
- $name
- $firstname
Constructeur : Réalisez un constructeur permettant de valoriser les propriétés de l'objet.
Méthodes:
- __toString() : Méthode permettant de retourner les informations de l'auteur
- format($withParentheses) : Permet d'afficher "$nom $prenom" si le paramètre est à true (ou 1) et affiche "$nom ($prenom)" si le paramètre vaut autre chose.
Exercice
PARTIE 2 :
Créer un nouveau script php, nommé "accueil.php" et insérez y le code HTML permettant d'afficher une page HTML intitulé "Accueil".
Au début du script, écrivez l'instruction afin d'inclure le fichier contenant la classe créée précédemment.
Dans la page HTML, insérez du PHP qui permettra d'instancier un objet Auteur, afficher sur la page les informations depuis la méthode format de cet objet.
Ajoutez ensuite les instructions de gestion des erreurs afin de pouvoir afficher une erreur en gras sur la page.
Exercice
Atelier fil rouge : Adapter le blog créé précédemment pour transformer le procédural en orienté objet.
Créez des classes pour tout ce qui a déjà été effectué sur l'atelier fil rouge depuis le début. Si vous ne savez pas par où commencer, créez une classe de connexion, celle ci étant utilisée partout vous saurez où des modifications sont nécessaires.
Le formalisme UML
U
M
L
nifed
odeling
anguage
Suite de diagrammes ayant chacun un but précis dans le but de modéliser l'intégralité d'un projet voire même d'un système d'information complet !

Since 1997
Pourquoi ?
- Simplifier la phase d'analyse et de modélisation du projet
- Communiquer et spécifier le projet avec le client
- Avoir une base commune entre les parties prenantes du projet pour mieux se comprendre
Sur quels projets ?
- Projets orientés objets
- N'importe quel cycle de vie d'un projet (cycle en V, cascade, méthodes agiles,...)
Diagramme de contexte
- Le diagramme de contexte est un diagramme simple qui décrit uniquement les acteurs qui interviennent sur le SI.
- Le SI y est représenté comme une boite noire, l’objectif est uniquement de connaître les acteurs.
- Ce diagramme est le premier diagramme a réaliser.
- A noter qu’il ne fait pas partie des normes de bases de l’UML.

Diagramme de packages
-
Le diagramme de packages permet de décomposer le système en catégories ou parties plus facilement observables, « packages ».
-
C’est un diagramme de contexte avec une granularité plus forte concernant les composants du système d’information.
-
Ça nous permet de savoir quels sont les différents ensembles qui composent le SI.

Diagramme de cas d'utilisations
-
Le diagramme de cas d’utilisation représente les fonctionnalités (ou cas d’utilisation) pouvant être réalisées par les acteurs. Elles doivent TOUTES être présente dans le diagramme de cas d’utilisations.
-
On peut faire un diagramme de cas d’utilisation pour le SI entier ou un pour chaque package.

Exercice
Exercice (Réaliser un diagramme de cas d’utilisations)
- Le contexte est simple, c’est un libraire qui souhaite concevoir un site web de vente / location de livres en ligne.
- Un visiteur peut créer un compte pour devenir lecteur. Ou se connecter à son compte.
- Le libraire souhaite pouvoir parcourir le catalogue, gérer le stock de son magasin et voir la liste des commandes pour en gérer leur statut.
- Un lecteur peut commander / acheter des livres, parcourir le catalogue et se déconnecter.
- L’administrateur lui a accès à une interface à part pour pouvoir gérer le contenu du catalogue (ajouter des catégories, modifier les contenus etc…). Avec connexion et déconnexion.
- L’exercice ici est de réaliser le diagramme de cas d’utilisations pour ces règles métier.
Diagramme d'activités
-
Diagramme qui permet d’avoir une vision d’ensemble des actions qui peuvent être effectués sur le SI. Il développe les scénarios, que ce soit le scénario classique, les exceptions ou les scénarios alternatifs.
-
Chaque action fait office d’un diagramme a part entière
-
C’est un diagramme qui a un début d’action, qui en défini les étapes et qui possède une fin.

Début
Fin
Exercice
Exercice (Réaliser un diagramme d’activité)
- Le contexte est simple, c’est un libraire qui souhaite concevoir un site web de vente / location de livres en ligne.
- Un visiteur peut créer un compte pour devenir lecteur. Ou se connecter à son compte.
- Le libraire souhaite pouvoir parcourir le catalogue, gérer le stock de son magasin et voir la liste des commandes pour en gérer leur statut.
- Un lecteur peut commander / acheter des livres, parcourir le catalogue et se déconnecter.
- L’administrateur lui a accès à une interface à part pour pouvoir gérer le contenu du catalogue (ajouter des catégories, modifier les contenus etc…). Avec connexion et déconnexion.
- L’exercice ici est de réaliser le diagramme d’activité du processus de commande d’un livre.
Diagramme de séquences
-
Il permet de représenter des échanges entre les différents objets et acteurs du système en fonction du temps. Celui-ci représente les méthodes (en termes de développement).
-
Il ajoute la notion d’acteurs et des informations « temporelles » au diagramme d’activités.

Exercice
Exercice (Réaliser un diagramme de séquences)
- Le contexte est simple, c’est un libraire qui souhaite concevoir un site web de vente / location de livres en ligne.
- Un visiteur peut créer un compte pour devenir lecteur. Ou se connecter à son compte.
- Le libraire souhaite pouvoir parcourir le catalogue, gérer le stock de son magasin et voir la liste des commandes pour en gérer leur statut. Le libraire doit être alerté lorsqu’un livre atteint le seuil de réapprovisionnement.
- Un lecteur peut commander / acheter des livres, parcourir le catalogue et se déconnecter. Les lecteurs ont un rang de lecture (« Débutant », « confirmé », « expert », « indétrônable »)
- L’administrateur lui a accès à une interface à part pour pouvoir gérer le contenu du catalogue (ajouter des catégories, modifier les contenus etc…). Avec connexion et déconnexion.
- L’exercice ici est de réaliser le diagramme de séquences pour le cas d’utilisation « gestion du stock par le libraire ».
Diagramme de classes
-
Durant la phase d’analyse, le diagramme de classes représente les informations manipulées par les utilisateurs
-
Durant la phase de conception, le diagramme de classes représente les objets, propriétés et méthodes de notre projet.
-
En soit, c’est le seul diagramme OBLIGATOIRE pour une modélisation UML.

Exercice
Réalisez le diagramme de classes des informations ci-dessous

Exercice
Exercice (Réaliser un diagramme de classes)
- Le contexte est simple, c’est un libraire qui souhaite concevoir un site web de vente / location de livres en ligne.
- Un visiteur peut créer un compte pour devenir lecteur. Ou se connecter à son compte.
- Le libraire souhaite pouvoir parcourir le catalogue, gérer le stock de son magasin et voir la liste des commandes pour en gérer leur statut. Le libraire doit être alerté lorsqu’un livre atteint le seuil de réapprovisionnement.
- Un lecteur peut commander / acheter des livres, parcourir le catalogue et se déconnecter. Les lecteurs ont un rang de lecture (« Débutant », « confirmé », « expert », « indétrônable »)
- L’administrateur lui a accès à une interface à part pour pouvoir gérer le contenu du catalogue (ajouter des catégories, modifier les contenus etc…). Avec connexion et déconnexion.
- L’exercice ici est de réaliser le diagramme de classes le plus COMPLET possible pour le cas en cours de traitement.
Conclusion
- L'UML est une suite de diagrammes décrivant le SI et le projet,
- L'UML permet de communiquer sur ces éléments entre toutes les parties prenantes,
- L'UML est nécessaire pour réaliser un projet en évitant les problèmes de compréhension du besoin,
- L'UML a encore évolué aujourd'hui et nous n'avons pas vu tous les diagrammes, seulement les principaux.

Les Designs patterns
Kesako ?
- Solutions architecturales à des problèmes objets
- Réutilisable à des problèmes de dévs récurrents
- Peu d’algorithmique quand on isole, plus des schéma orientés-objet (UML!!)
-
Façons d’organiser le code pour augmenter
- Flexibilité du code
- Maintenabilité du code
- Extensibilité du code
- Configurabilité du code
- (Diminuer) Duplication de code
- Le plus souvent basé sur des interfaces et abstractions


Les design patterns : classification
-
Patterns créateurs (Singleton, factory, abstract factory)
-
Patterns aidant à la gestion de la création d’objet
-
-
Patterns structurants (Façade, proxy, decorator, composite, adapter)
-
On parle de travailler sur la partie externe des classes du pattern. L’extensibilité et l’encapsulation des classes.
-
-
Patterns comportementaux (Strategy, iterator, observer, state)
-
Ici, on travaille sur la partie interne des classes du pattern. La dynamique des classes du pattern. Améliorer la qualité du code, éviter les duplications ou gérer des problématiques connues.
-

Définition
L'idée principale est de pouvoir mettre en place une certaine stratégie ou ce que l’on va régulièrement appeler un comportement afin de pouvoir en changer dynamiquement au runtime.
Sans pattern stratégie, on serait obligé de multiplier les classes en produit cartésien pour pouvoir avoir autant de combinaisons de comportements que nécessaire. (Horrible)
Problématique
L’héritage est puissant mais il ne permet de partager du code que de manière verticale, c’est-à-dire à ses enfants.
Par contre, si les enfants veulent partager du code entre eux, aucun moyen de le faire à part en dupliquant le code (Horrible).
Pattern Stratégie
UML : Pattern Stratégie

Exemple : Pattern Stratégie

Pattern Stratégie : Avantages
-
Meilleure lisibilité du code. (Pas de duplication, pas de gros pavés de méthodes dans une seule classe)
-
S’assurer que chaque élément à sa propre responsabilité (découplage fort)
-
Et surtout avoir des algorithmes interchangeables au runtime sans avoir à multiplier les classes.

Définition
Définir une dépendance entre un objet observé et un ou plusieurs objets observants.
L’objectif étant de pouvoir notifier les objets observants lorsqu’un changement de statut est opéré sur l’objet observé.
Problématique
On a parfois besoin de connaître le changement de statut d’un autre objet. Il est possible d’interroger l’objet en continue pour connaître son statut et le mettre à jour si nécessaire.
Ceci est très gourmand s’il y’a plusieurs abonnés et surtout si on interroge toutes les secondes, alors que le statut change de manière aléatoire ?
Ceci n’est pas efficace.
Pattern Observer
UML : Pattern Observer

* Optionnelle : Si on ne met pas de lien entre concreteSubject et ConcreteObserver, ça nous force à passer un objet ConcreteSubject dans la méthode update()
* Optionnelle
Pattern Observer : Avantages
-
Eviter les opérations de PULL massives et simplement effectuer un push / pull lorsque c’est nécessaire.
-
Plus concrètement, améliorer la logique métier
-
Diminuer le coûts de l’observation
-
Supprimer la question de l’intervalle d’interrogation

Définition
Comme son nom l’indique, il a pour objectif de rendre une interface non adaptée à une autre, compatible. En rajoutant un objet intermédiaire nommé « Adapter ».
Problématique
Les interfaces exposées ne sont pas toujours compatibles avec ce que nous avons, il nous faut donc réaliser une adaptation intermédiaire pour pouvoir coupler les deux.
Pattern Adapter
UML : Pattern Adapter

Pattern Adapter : Avantages
-
Adapter une interface pour qu’elle s’imbrique dans une autre, tout simplement.
-
Découplage fort
-
Peut-être facilement mis en place même après coup, à moindre coût (sauf pour le code client, qui va forcément devoir être adapté ou il ne sera pas homogène)

Définition
Permet d’ajouter dynamiquement des propriétés à un objet.
En pouvant empiler/décorer avec autant d’objets décorable que l’on souhaite.
L’objet décoré et le ou les objets décorants s’utilisent de la même façon, excepté que la plupart du temps, les objets décorants ne peuvent pas exister sans objet à décorer.
Problématique
Duplication de code et multiplication des classes pour gérer toutes les possibilités (inutiles).
Pattern Decorator
UML : Pattern Decorator

Pattern Decorator : Avantages
-
Simple à mettre en place
-
Evite la multiplication des classes
-
Permet d’ajouter des caractéristiques multiples sans limite (excepté celles définies par l’interface) à un objet de base.
-
Le fait d’envelopper permet de facilement exécuter des opérations qui sont à effectuer sur chaque enveloppe pour en avoir un résultat global (prix d’une boisson par exemple)
-
Attention, ça ne permet pas de connaître l'ordre de décoration !!!

Exercice : Pattern Decorator
-
Adaptez le diagramme vu ensemble en utilisant la problématique suivante :
-
On a une boisson de plusieurs type : café, chocolat au lait, thé, …
-
Chaque boisson peut avoir plusieurs décorations : sucre, caramel, chocolat,…
-
-
Réalisez le diagramme UML correspondant à ce sujet
-
Réalisez le code (ou à minima pseudo code) permettant de mettre ceci en œuvre
-
Décorez un café avec deux fois du caramel et une fois du sucre, par exemple.
30 minutes, si besoin de plus de temps vous pouvez me demander
Définition
Le pattern singleton est le plus simple des patterns, il permet de s’assurer qu’un objet est instancier qu’une et une seule fois dans toute votre application.
Ce sera toujours la MÊME instance de l’objet quelque soit depuis quel endroit l’objet est appelé.
Problématique
On instancie un objet quelque part, on y fait des opérations dessus, puis on souhaite à nouveau réutiliser cet objet à un autre endroit.
Pour que les opérations soient gardées en mémoire, on ne peut pas le faire, car on devra réinstancier la classe puis réeffectuer les opérations dessus. (Ou alors rajouter des dépendances inutiles)
Pattern Singleton
UML : Pattern Singleton

Pattern Singleton: Avantages
-
S’assurer qu’un objet est instancier qu’une seule fois et y avoir accès facilement depuis n’importe où dans votre application.

Pattern Singleton : Désavantages
-
Certains estiment que le pattern singleton est un mauvais pattern (à ne pas confondre avec anti-pattern). Pour deux raisons, à ma connaissance :
-
1. Le pattern singleton est utilisable uniquement en statique, les débats sont nombreux avec tout ce qui tourne autour du mot clé « static ». Je vous laisserai vous renseigner et vous faire votre propre opinion, mais sachez que pour ma part, je l’utilise très fréquemment.
-
2. D’après certains développeurs, le fait de dire qu’on est certain que l’on veut une seule instance de son objet à tout jamais dans son application n’est pas en lien avec le fait de faire de son application une application évolutive à toute épreuve.
Pour eux, afin que ça reste évolutif, on ne peut pas se limiter à une seule instanciation.
Je comprends le point de vue, mais je n’y adhère pas. J’utilise fréquemment le singleton pour instancier ma base de données par exemple. Dans 99,99% des cas, je sais à l’avance que je n’aurai qu’une instance de base de données et ceci n’évoluera pas au fil du temps.
-

Exercice
Atelier fil rouge : Adapter le blog créé précédemment pour y intégrer des patrons de conceptions intéressants.
A vous de modéliser la chose et rajouter au blog les éléments de code nécessaire à la mise en place des patterns.
N'hésitez pas à rajouter des choses pour que ça puisse correspondre à des patterns que vous souhaitez pratiquer.
Evaluation
Evaluation
Workshop réaliser un jeu du Serpent (version plateau)
Globalement, le but de ce workshop est de réaliser un jeu du serpent en version plateau, deux joueurs doivent lancer un dé au tour par tour et le premier arrivé à la case 50 gagne la partie.
Vous devez enregistrer au format json le résultat des parties.
Envoyer le workshop d'évaluation.
C'est cet exercice qui sera utilisé afin d'évaluer vos compétences
PHP
By Cėdric Brasseur
PHP
- 1,287