Tp 4 php classes models blogpoo
Thème :
Junior
1 vues ·7/9 leçons

05 - La Classe Comment et le Contrôle des Droits

La classe Comment est un excellent exemple pour illustrer comment l’encapsulation simplifie la gestion des permissions (autorisations).


1. L’absurde : Le contrôle des droits dans le contrôleur

Dans notre précédente version (et dans beaucoup d’applications débutantes), quand on voulait supprimer un commentaire, on mettait toute la logique de vérification dans le fichier user-comment-delete.php :

// ❌ Logique métier ("Business logic") exposée dans le contrôleur
$comment = findCommentById($comment_id);
$isAdmin = $_SESSION['auth']['role'] === 'admin';

// Condition à rallonge et difficile à relire
if ($comment['user_id'] !== $user_id && !$isAdmin) {
    exit('Vous ne pouvez pas supprimer ce commentaire.');
}

Où est le problème ?

  1. Répétition : Si demain vous voulez ajouter un bouton “Éditer” sur le commentaire, vous devrez copier-coller exactement la même condition complexe dans user-comment-edit.php.
  2. Fragilité : Si les règles de l’entreprise changent (ex: on ajoute un rôle “Modérateur” qui a aussi le droit de supprimer), il faudra chasser tous ces if dans tous les fichiers du projet.

2. La Solution Concrète : L’intelligence dans l’Objet

Un commentaire sait à qui il appartient. C’est à lui de répondre à la question : “Est-ce que cette personne a le droit de te toucher ?”

Nous avons ajouté une méthode d’instance belongsTo() dans la classe Comment :

// Dans Comment.php
public function belongsTo(int $userId, bool $isAdmin = false): bool
{
    // C'est le commentaire qui contient sa propre règle métier !
    return $this->user_id === $userId || $isAdmin;
}

Maintenant, regardez à quel point le contrôleur devient propre, expressif et presque “littéraire” :

// Dans user-comment-delete.php
$comment = Comment::find((int) $comment_id);

// On demande à l'objet !
if (!$comment->belongsTo($user_id, $isAdmin)) {
    exit('Accès refusé.');
}

$comment->delete();

3. La dénormalisation des propriétés (JOIN)

Dans notre classe Comment, vous avez peut-être remarqué ces propriétés :

public function __construct(
    public readonly int $id = 0,
    public string $content = '',
    public int $article_id = 0,
    public int $user_id = 0,
    public string $created_at = '',
    // Propriétés récupérées via JOIN, pas stockées dans la table comments !
    public string $username = '',
    public string $article_title = '',
) {
    parent::__construct();
}

Pourquoi avoir mis $username ici ? Quand on récupère une liste de commentaires via la méthode statique Comment::findByArticle(), on fait un JOIN users. La base de données renvoie donc une colonne username en plus.

public static function findByArticle(int $article_id): array
{
    // ...
    $stmt = $instance->pdo->prepare('
        SELECT comments.*, users.username
        FROM comments
        JOIN users ON comments.user_id = users.id
    ');
    // ...
}

Le constructeur de Comment est assez intelligent pour accepter cette donnée supplémentaire ($row['username'] ?? '') et la stocker. Ainsi, dans votre vue HTML, au lieu de chercher un tableau imbriqué complexe, vous écrivez simplement :

// Dans la vue HTML
<h3>Commentaire de : <?= htmlspecialchars($commentaire->username) ?></h3>

C’est simple, c’est typé, et c’est protégé par l’encapsulation de l’objet.

Prêt à passer à la suite ?

Vous avez terminé cette leçon sur 05 - La Classe `Comment` et le Contrôle des Droits. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.