16. La classe Controller

Notre classe Controller

Nous allons maintenant mettre en place un nouveau contrôleur dans notre application : Controller

Mais pourquoi faire ? On en a pas déjà assez comme ça ? 😡

Actuellement, si vous regardez de près vos Controller, vous devez remarquer qu'on répète souvent des informations. 

Dans le constructeur de chacune des méthodes, on passe souvent les mêmes informations : que ce soit la classe View, les classes DAO...

On va maintenant éviter de se répéter 😉

Créez votre nouvelle classe Controller :

<?php

namespace App\src\controller;

class Controller
{
    
}

 Ce contrôleur ne sera JAMAIS instancié, vous pouvez donc le passer en abstract.

Mais attends, quel est l'intérêt ici de créer un contrôleur qu'on ne va jamais utiliser ? 

Je n'ai jamais dis qu'il n'allait pas être utilisé, j'ai simplement dis qu'il n'allait jamais être instancié. Pour récupérer ses propriétés et ses méthodes, on va utiliser l'héritage 😁

Mais attends, il est vide le contrôleur, on met quoi à l'intérieur ?

Ouvrez votre FrontController et récupérez dans ce dernier : 

- les use

- les propriétés

- la méthode construct

Voici la classe Controller actualisée : 

<?php

namespace App\src\controller;

use App\src\DAO\ArticleDAO;
use App\src\DAO\CommentDAO;
use App\src\model\View;

abstract class Controller
{
    private $articleDAO;
    private $commentDAO;
    private $view;

    public function __construct()
    {
        $this->articleDAO = new ArticleDAO();
        $this->commentDAO = new CommentDAO();
        $this->view = new View();
    }
}
Oui, mais je fais comment maintenant dans mon FrontController ? Et dans les autres ?

On va simplement passer les propriétés de notre Controller en protected et utiliser l'héritage dans nos classes filles 😉

Voici la classe Controller actualisée : 

<?php

namespace App\src\controller;

use App\src\DAO\ArticleDAO;
use App\src\DAO\CommentDAO;
use App\src\model\View;

abstract class Controller
{
    protected $articleDAO;
    protected $commentDAO;
    protected $view;

    public function __construct()
    {
        $this->articleDAO = new ArticleDAO();
        $this->commentDAO = new CommentDAO();
        $this->view = new View();
    }
}

Et voici la classe FrontController actualisée : 

<?php

namespace App\src\controller;

class FrontController extends Controller
{
    public function home()
    {
        $articles = $this->articleDAO->getArticles();
        return $this->view->render('home', [
           'articles' => $articles
        ]);
    }

    public function article($articleId)
    {
        $article = $this->articleDAO->getArticle($articleId);
        $comments = $this->commentDAO->getCommentsFromArticle($articleId);
        return $this->view->render('single', [
            'article' => $article,
            'comments' => $comments
        ]);
    }
}

Faites en de même pour nos classes BackController et ErrorController

BackController

<?php

namespace App\src\controller;

class BackController extends Controller
{
    public function addArticle($post)
    {
        if(isset($post['submit'])) {
            $this->articleDAO->addArticle($post);
            header('Location: ../public/index.php');
        }
        return $this->view->render('add_article', [
            'post' => $post
        ]);
    }
}

 ErrorController

<?php

namespace App\src\controller;

class ErrorController extends Controller
{
    public function errorNotFound()
    {
        return $this->view->render('error_404');
    }

    public function errorServer()
    {
        return $this->view->render('error_500');
    }
}

 Occupons-nous maintenant d'ajouter une nouvelle classe, la classe Request 😅

 

Bilan

Dans ce chapitre, nous avons mis en place un Controller qui va centraliser les données qui seront utilisées par les Controllers qui héritent de cette classe.

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