Skip to content

frdemoulin/S05-E02-support-controllers-views-freddmn08

Repository files navigation

Structurer en objets une application

Voici un petit site internet de 4 pages.

Actuellement, il est composé de 4 fichiers HTML statiques.

On va améliorer ce site et rendre le tout dynamique, tout en suivant une structuration objet plus professionnelle, plus maintenable et plus scalable.

Etape 1 : préparation

  • déplacer les fichiers HTML dans un sous-répertoire views
  • renommer ces fichiers HTML en fichiers PHP
  • créer les 4 fichiers "point d'entrée" PHP à la racine du projet :
    • index.php
    • products.php
    • store.php
    • about.php
  • dans chacun de ces fichiers, inclure le fichier de vue correspondant
    include(__DIR__.'/views/index.tpl.php'); // pour la home

Etape 2 : views

  • view ou template, même combat 💪 🎨 💄
  • factoriser le code HTML répété dans les fichiers de vues
    • créer une vue header.tpl.php dans views
    • créer une vue footer.tpl.php dans views
  • modifier les fichiers "point d'entrée" pour inclure ces vues header.tpl.php et footer.tpl.php

Etape 3 : controllers

  • créer une classe MainController dans le sous-répertoire controllers
  • déclarer 4 méthodes vides dans ce MainController :
    • home (correspondant à la page index.php)
    • about (correspondant à la page about.php)
    • products (correspondant à la page products.php)
    • store (correspondant à la page store.php)
  • déclarer la méthode show dans MainController qui va s'occuper d'inclure les views
    public function show($viewName, $viewVars=array()) {
      // $viewVars est disponible dans chaque fichier de vue
      include(__DIR__.'/../views/header.tpl.php');
      include(__DIR__.'/../views/'.$viewName.'.tpl.php');
      include(__DIR__.'/../views/footer.tpl.php');
    }
  • dans le corps des 4 méthodes vides, appeler la méthode show sur l'objet courant ($this) en précisant en paramètre quelle views vous souhaitez
    public function home() {
      // Délègue l'affichage à la méthode "show" du MainController
      $this->show('home');
    }
  • modifier chaque fichier "point d'entrée"
    • retirer l'inclusion existante (views)
    • inclure la classe MainController
    • instancier un objet MainController
    • appeler la méthode de l'objet MainController correspondant au point d'entrée
      <?php
      // File index.php
      // Instanciation de la classe MainController
      $controller = new MainController();
      // Appel de la méthode correspondant à ce point d'entrée (page)
      $controller->home();
  • point d'entrée > méthode du controller > views > 👌

Bonus Templator

Intégrer notre classe de template Templator 🤓

  • Templator est un système de gestion des templates permettant de faire mieux que de simples include de views

  • rechercher à quel endroit du code actuel nous incluons les views

  • remplacer ces include ou require par l'utilisation de la classe Templator

    • instancier l'objet
    • définir les "variables" pour les views (fournies en paramètre)
    • appeler la méthode display()
    Indice "endroit du code"

    Inclure les views ou templates, c'est afficher/générer le code HTML
    Une seule méthode s'occupe de la partie affichage 😉

    Spoiler "endroit du code"

    méthode show du MainController

    Spoiler réponse
    public function show($viewName, $viewVars=array()) {
      // Instanciation de l'objet Templator
      $templateEngine = new Templator(__DIR__.'/../views/');
    
      // Définition des "variables" pour les _views_
      foreach ($viewVars as $varName=>$varValue) {
        $templateEngine->addData($varName, $varValue);
      }
    
      // Penser à modifier les variables dans les templates ($this->getVar())
      $templateEngine->display($viewName);
    }

Dernière étape

Job's done ! 💪 🎉 🍾

Se féliciter, relire la structure de nos fichiers et se représenter le parcours du script PHP dans nos fichiers pour afficher une page HTML

About

S05-E02-support-controllers-views Fresh coffee shop

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published