A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

1.2. Un exemple de site PHP sans framework

Pour vous montrer comme il est difficile de construire un site sans framework PHP, nous allons écrire un site très simple composé de trois pages HTML: Accueil, Connexion et Déconnexion.

Petite précision, écrire un site avec un framework PHP peut également être difficile, mais avec un framework vous le ferez de manière cohérente et sécurisée.

1.2.1. Page d'accueil

Lorsque vous écrivez un site en PHP, vous mettez votre code dans un fichier avec l'extension .php. Un tel fichier s'appelle un script PHP.

Pour commencer, implémentons la page Home du site. Pour ce faire, créez un fichier index.php à la racine de votre répertoire Apache et placez le code suivant:

Pour comprendre le code ci-dessous, vous devez avoir un peu d'expérience avec PHP. Si ce n'est pas le cas, il serait bon de vous référez à un tutoriel PHP comme ceux du w3schools.com.

<?php 
// index.php
session_start();

// Si l'utilisateur est connecté, on récupère son identité via la session.
$identity = null;
if (isset($_SESSION['identity'])) {
    $identity = $_SESSION['identity'];
}
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Page d'accueil</title>
    </head>
    <body>
        <h1>Page d'accueil</h1>
        <?php if ($identity==null): ?>
        <a href="login.php">Connexion</a>
        <?php else: ?>
        <strong>Bienvenue, <?= $identity ?></strong> <a href="logout.php">Déconnexion</a>
        <?php endif; ?>
        
        <p>
            Ceci est un simple site web pour démontrer les avantages d'un framework PHP et les inconvénients du PHP "pur".
        </p>
    </body>
</html>

Si vous tapez "http://localhost/index.php" dans votre navigateur (comme Google Chrome ou Firefox), vous devriez voir une page comme ci-dessous :

Une page d'accueil simple Une page d'accueil simple

1.2.2. Page Connexion

Maintenant, implémentons la page Connexion. Ce genre de page devrait présenter un formulaire avec les champs E-mail et Mot de passe. Une fois que l'utilisateur valide le formulaire, il passe l'authentification et son identité est enregistrée dans la session PHP. Le script ressemblerait alors à ceci :

<?php 
// login.php
session_start();

// Si l'utilisateur est connecté, on le redirige vers index.php
if (isset($_SESSION['identity'])) {
    header('Location: index.php');
    exit;
}

// On vérifie que le formulaire est soumis.
$submitted = false;
if ($_SERVER['REQUEST_METHOD']=='POST') {
    
    $submitted = true;
    
    // On récupère les données du formulaire
    $email = $_POST['email'];
    $password = $_POST['password'];
    
    // On authentifie l'utilisateur
    $authenticated = false;
    if ($email=='admin@example.com' && $password=='Secur1ty') {
        $authenticated = true;
        
        // On enregistre son identité en session.
        $_SESSION['identity'] = $email;
        
        // On redirige l'utilisateur vers la page index.php.
        header('Location: index.php');
        exit;
    }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Page de connexion</title>
    </head>
    <body>
        <h1>Connexion</h1>
        <?php if ($submitted && !$authenticated): ?>
            <div class="alert">
                Les informations d'identification sont invalides.
            </div>
        <?php endif; ?>
        <form name="login-form" action="/login.php" method="POST">
            <label for="email">E-mail</label>
            <input type="text" name="email">
            <br>
            <label for="password">Mot de passe</label>
            <input type="password" name="password">
            <br>
            <input type="submit" name="submit" value="Connexion">
        </form>
    </body>
</html>

Si vous ouvrez la page "http://localhost/login.php" dans votre navigateur, vous devriez voir quelque chose comme ca :

A page de connexion simple A page de connexion simple

Pour vous connecter, utilisez admin@example.com and Secur1ty comme e-mail et mot de passe.

1.2.3. Page Déconnexion

Et pour finir, implémentons la page Déconnexion qui va effacer l'identité de l'utilisateur enregistré en session:

<?php 
// logout.php
session_start();

unset($_SESSION['identity']);
header('Location: index.php');
exit;

Le code complet de ce site simple peut être trouvé dans l'exemple PHP pur fourni avec ce livre.

1.2.4. Relecture du code

Les scripts ci-dessus ne sont pas seulement un exemple typique d'un site PHP "pur". Ils sont aussi un exemple de comment ne pas écrire vos sites (même les plus simples). Quels sont les problèmes ?

  1. Les scripts index.php et login.php aurait tendance à être fusionner en un seul fichier. Vous n'avez aucune séparation des objectifs, ce qui rend votre code trop complexe. Intuitivement, vous comprenez qu'il serait être plus pratique de diviser le code qui gère l'authentification de celui qui concerne la présentation (rendu HTML).

  2. Les URL de vos pages ne sont pas terribles (par exemple, "http://localhost/index.php"). Il vaudrait mieux cacher cette extension ".php". Et que se passe-t-il lorsqu'un utilisateur Web tente de visiter une page qui n'existe pas? Il vaudrait mieux rediriger l'utilisateur vers une page d'erreur dans ce cas.

  3. Et si ce site devait s'agrandir ? Comment organiseriez-vous votre code? Un script PHP par page ? Et si vous voulez réutiliser certains de vos scripts PHP sur d'autres sites web sans modifications? Intuitivement vous pourriez comprendre qu'il serait utile d'organiser le code dans une sorte de module réutilisable.

  4. Les scripts index.php et login.php contiennent des balises HTML en commun. Pourquoi les copier dans tous les scripts PHP, alors que nous souhaitons réutiliser cette disposition sur toutes (ou presque toutes) les pages.

  5. Le script login.php a des problèmes de sécurité, car nous n'avons implémenté aucune validation des variables POST. La session PHP est également soumise au piratage. Et le script PHP login.php sera situé dans le répertoire racine du serveur Apache, ce qui n'est pas très sécurisé (il serait préférable de le placer dans un endroit inaccessible aux internautes). Le fichier index.php est également non sécurisé, car nous n'avons pas filtré la sortie PHP (sujette aux attaques XSS).

  6. Ces scripts n'utilisent aucune classe PHP. Encapsuler la fonctionnalité dans les classes en théorie rendrait le code bien structuré et facile à maintenir.

  7. Dans ces scripts, vous devez écrire votre propre implémentation de l'authentification de l'utilisateur (et ainsi de suite). Pourquoi réinventer la roue et ne pas utiliser une librairie bien conçue pour cela ?

Les problèmes ci-dessus sont facilement résolus lorsque vous écrivez un site Web avec un framework (comme Zend Framework 3):

  1. Avec ZF3, vous utilisez le modèle de conception Model-Vue-Controller, divisant votre code PHP en Modèles (le code responsable de l'authentification irait ici), Vues (le code responsable du rendu HTML irait ici) et Controleurs (le code responsable de la récupération des variables POST irait ici).

  2. Le routage ZF3 permet de faire un affichage plus professionnel des URL en masquant les extensions .php. La facon dont les URL doivent être composées sont définies par des règles strictes. Si un utilisateur essaie d'accéder à une page inexistante, il est automatiquement redirigé vers une page d'erreur standard.

  3. En ZF3, vous pouvez utiliser le concept de module. Cela permet de séparer facilement vos modèles, vues et contrôleurs en unité autonome (module) et de réutiliser facilement cette unité dans un autre projet.

  4. Dans ZF3, vous pouvez définir une vue (layout) commune et la réutiliser sur toutes (ou la plupart) des pages.

  5. ZF3 vous offre diverses fonctions de sécurité, telles que des filtres et validateurs de formulaires, des échappements de code, des validateurs de session, des algorithmes de cryptographie, etc. Dans un site web ZF3, seul l'index.php est accessible aux internautes, tous les autres scripts PHP sont situés en dehors du répertoire racine du serveur Apache.

  6. Dans un site ZF3, vous mettez votre code dans des classes, ce qui le rend bien organisé.

  7. ZF3 vous fournit de nombreux composants que vous pouvez utiliser dans votre site Web: un composant pour l'authentification, un composant pour travailler avec des formulaires, etc.

Vous avez maintenant une idée des avantages de Zend Framework 3 et de ce qu'il peut faire pour vous. Dans les sections suivantes, nous décrirons ZF3 plus en détail.


Top