10. Le contrôleur frontal

Quelques explications

Le contrôleur frontal va nous permettre d'intercepter toutes les requêtes et de renvoyer une réponse.

On va donc faire appel à  index.php  qui va jouer ce rôle et nous donner la page que l'on souhaite en fonction de notre besoin.

On va donc passer des paramètres à notre page index.php  (via GET) et en fonction de ces paramètres, on affichera une vue associée :

- si notre  index.php  n'a pas de paramètre par défaut, on affichera la home

- si notre index.php  à un paramètre article, on affichera la page single

- si un autre paramètre est spécifié, on affichera une erreur

Allez, on y retourne 😉

 

index.php

On va donc créer notre fichier  index.php  (que l'on met dans le dossier  public  )

Attention à ne pas le mettre à la racine de son projet ❗️❗️❗️

Je reviendrais plus tard sur l'intérêt de ne pas mettre ce fichier à la racine de son projet 😄

<?php

require '../vendor/autoload.php';

try{
    if(isset($_GET['route']))
    {
        if($_GET['route'] === 'article'){
            require '../templates/single.php';
        }
        else{
            echo 'page inconnue';
        }
    }
    else{
        require '../templates/home.php';
    }
}
catch (Exception $e)
{
    echo 'Erreur';
}

On vient de centraliser l'appel à l'  Autoloader  dans le fichier  index.php

Vous pouvez retirer les appels à ce dernier dans les fichiers  home.php  et  single.php

Dans le fichier  home.php  , pensez à changer le lien :

<?php
use App\src\DAO\ArticleDAO;
?>
<!--
Code inchangé
-->
<h2><a href="../public/index.php?route=article&articleId=<?= htmlspecialchars($article->id);?>"><?= htmlspecialchars($article->title);?></a></h2>
<!--
Code inchangé
-->

Idem dans le fichier  single.php  :

<?php
use App\src\DAO\ArticleDAO;
use App\src\DAO\CommentDAO;
?>
<!--
Code inchangé
-->
    <a href="../public/index.php">Retour à l'accueil</a>
<!--
Code inchangé
-->

Si vous essayez de naviguer depuis l'URL http://localhost/blog/public/index.php , on est toujours bon. 

Si cela ne fonctionne pas, assurez-vous bien d'être dans le dossier public.

 

Améliorons notre architecture

On va aussi s'occuper de créer un fichier de configuration pour notre application. Si vous vous souvenez du fichier  DAO.php  , les identifiants de connexion sont dans le fichier, déplaçons les dans un fichier  dev.php  (que l'on va créer dans le dossier  config  ) :

<?php

const DB_HOST = 'mysql:host=localhost;dbname=blog;charset=utf8';
const DB_USER = 'root';
const DB_PASS = 'root';

On peut maintenant modifier les paramètres de  PDO  dans la méthode  getConnection() en retirant les constantes et en supprimant l'appel à self comme ici :

<?php

namespace App\src\DAO;

use PDO;
use Exception;

abstract class DAO
{

    private $connection;

    private function checkConnection()
    {
        //Vérifie si la connexion est nulle et fait appel à getConnection()
        if($this->connection === null) {
            return $this->getConnection();
        }
        //Si la connexion existe, elle est renvoyée, inutile de refaire une connexion
        return $this->connection;
    }

    //Méthode de connexion à notre base de données
    private function getConnection()
    {
        //Tentative de connexion à la base de données
        try{
            $this->connection = new PDO(DB_HOST, DB_USER, DB_PASS);
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //On renvoie la connexion
            return $this->connection;
        }
            //On lève une erreur si la connexion échoue
        catch(Exception $errorConnection)
        {
            die ('Erreur de connection :'.$errorConnection->getMessage());
        }

    }

    protected function createQuery($sql, $parameters = null)
    {
        if($parameters)
        {
            $result = $this->checkConnection()->prepare($sql);
            $result->setFetchMode(PDO::FETCH_CLASS, static::class);
            $result->execute($parameters);
            return $result;
        }
        $result = $this->checkConnection()->query($sql);
        $result->setFetchMode(PDO::FETCH_CLASS, static::class);
        return $result;
    }
}

J'en profite pour découper un peu plus ce fichier :

<?php

const HOST = 'localhost';
const DB_NAME = 'blog';
const CHARSET = 'utf8';
const DB_HOST = 'mysql:host='.HOST.';dbname='.DB_NAME.';charset='.CHARSET;
const DB_USER = 'root';
const DB_PASS = 'root';

Dernière chose, on ajoute l'appel au fichier  dev.php  dans le fichier dans  index.php

<?php

require '../config/dev.php';
require '../vendor/autoload.php';

try{
    if(isset($_GET['route']))
    {
        if($_GET['route'] === 'article'){
            require '../templates/single.php';
        }
        else{
            echo 'page inconnue';
        }
    }
    else{
        require '../templates/home.php';
    }
}
catch (Exception $e)
{
    echo 'Erreur';
}
L'autoloader ne fait pas déjà le chargement du fichier dev.php ? 😅

Eh non, il s'occupe de charger les classes,  dev.php  est un fichier de configuration qui n'en contient pas. 

Toujours dans le but d'avoir une architecture plus adaptée, on va maintenant travailler sur un système de routing, avec une classe associée.

 

Bilan

Dans ce chapitre, nous avons ajouté notre contrôleur frontal, représenté par le fichier  index.php  , qui intercepte toutes les requêtes et renvoie vers la vue en conséquence. Nous en avons aussi profité pour centraliser l'appel à notre fichier de configuration, ainsi que l'appel à notre Autoloader.

Vous pouvez retrouver le code associé à ce chapitre sur GitHub.