Classes Managers
MVC en PHP : Passage du modèle en objet
Passage du modèle en objet
nous allons encapsuler notre modèle dans une classe.Histoire de bien faire les choses, on va créer 2 classes car on peut considérer qu'on a 2 types d'objets différents :
- PostManager : un gestionnaire de post de blog
- CommentManager : un gestionnaire de commentaire
- model/PostManager.php
- model/CommentManager.php
La classe PostManager
Le fichier qui contient la classe PostManager s'appelle model/PostManager.php. Nous y regroupons toutes nos fonctions qui concernent les posts :model/PostManager.php :
<?php
class PostManager {
public function getPosts() {
$db = $this->dbConnect();
$req = $db->query('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS creation_date_fr FROM posts ORDER BY creation_date DESC LIMIT 0, 5');
return $req;
}
public function getPost($postId) {
$db = $this->dbConnect();
$req = $db->prepare('SELECT id, title, content, DATE_FORMAT(creation_date, \'%d/%m/%Y à %Hh%imin%ss\') AS creation_date_fr FROM posts WHERE id = ?');
$req->execute(array($postId));
$post = $req->fetch();
return $post;
}
private function dbConnect() {
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root');
return $db;
}
}
La classe CommentManager
Nous faisons la même chose pour la classe CommentManager , qui contient toutes les fonctions qui concernent les commentaires :model/CommentManager.php :
<?php
class CommentManager {
public function getComments($postId) {
$db = $this->dbConnect();
$comments = $db->prepare('SELECT id, author, comment, DATE_FORMAT(comment_date, \'%d/%m/%Y à %Hh%imin%ss\') AS comment_date_fr FROM comments WHERE post_id = ? ORDER BY comment_date DESC');
$comments->execute(array($postId));
return $comments;
}
public function postComment($postId, $author, $comment){
$db = $this->dbConnect();
$comments = $db->prepare('INSERT INTO comments(post_id, author, comment, comment_date) VALUES(?, ?, ?, NOW())');
$affectedLines = $comments->execute(array($postId, $author, $comment));
return $affectedLines;
}
private function dbConnect(){
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root');
return $db;
}
}
Mise à jour du contrôleur
Maintenant que nous avons créé des classes, il nous faut créer des objets à partir d'elles. Notre contrôleur doit être adapté car il ne doit plus appeler des fonctions mais des fonctions situées à l'intérieur d'objets (des fonctions membres).controller/frontend.php :
<?php
// Chargement des classes
require_once('model/PostManager.php');
require_once('model/CommentManager.php');
function listPosts() {
$postManager = new PostManager(); // Création d'un objet
$posts = $postManager->getPosts(); // Appel d'une fonction de cet objet
require('view/frontend/listPostsView.php');
}
function post() {
$postManager = new PostManager();
$commentManager = new CommentManager();
$post = $postManager->getPost($_GET['id']);
$comments = $commentManager->getComments($_GET['id']);
require('view/frontend/postView.php');
}
function addComment($postId, $author, $comment) {
$commentManager = new CommentManager();
$affectedLines = $commentManager->postComment($postId, $author, $comment);
if ($affectedLines === false) {
throw new Exception('Impossible d\'ajouter le commentaire !');
}
else {
header('Location: index.php?action=post&id=' . $postId);
}
}