04-gestion-contenu
<?php
interface Content {
public function publish(): void;
public function unpublish(): void;
public function delete(): void;
public function schedulePublication(DateTime $date): void;
public function addComment(string $author, string $text): void;
public function likeContent(int $userId): void;
}
class Article implements Content {
private string $title;
private string $body;
private bool $published = false;
private array $comments = [];
public function publish(): void {
$this->published = true;
$db = new PDO('mysql:host=localhost;dbname=cms','root','');
$stmt = $db->prepare('UPDATE articles SET published = 1 WHERE id = ?');
$stmt->execute([$this->id]);
}
public function unpublish(): void { $this->published = false; }
public function delete(): void { /* ... */ }
public function schedulePublication(DateTime $date): void { /* ... */ }
public function addComment(string $author, string $text): void {
$this->comments[] = ['author' => $author, 'text' => $text];
}
public function likeContent(int $userId): void { /* ... */ }
}
class StaticPage implements Content {
private string $title;
private string $content;
public function publish(): void { /* Les pages statiques sont toujours publiées */ }
public function unpublish(): void {
throw new Exception("Les pages statiques ne peuvent pas être dépubliées");
}
public function delete(): void {
throw new Exception("Les pages statiques ne peuvent pas être supprimées");
}
public function schedulePublication(DateTime $date): void {
throw new Exception("Les pages statiques ne supportent pas la planification");
}
public function addComment(string $author, string $text): void {
throw new Exception("Les pages statiques ne supportent pas les commentaires");
}
public function likeContent(int $userId): void {
throw new Exception("Les pages statiques ne supportent pas les likes");
}
}
class Banner implements Content {
private string $imageUrl;
private string $link;
public function publish(): void { /* ... */ }
public function unpublish(): void { /* ... */ }
public function delete(): void { /* ... */ }
public function schedulePublication(DateTime $date): void { /* ... */ }
public function addComment(string $author, string $text): void {
throw new Exception("Les bannières ne supportent pas les commentaires");
}
public function likeContent(int $userId): void {
throw new Exception("Les bannières ne supportent pas les likes");
}
}
/*
=== USER STORIES ===
US1: En tant que développeur, je veux créer un nouveau type de contenu "Video"
qui supporte publication, suppression et likes, mais pas les commentaires.
US2: En tant que content manager, je veux lister tous les contenus qui supportent
les commentaires sans avoir à gérer des exceptions.
US3: En tant que développeur, je veux écrire du code générique qui manipule
n'importe quel contenu sans risquer des exceptions inattendues.
US4: En tant que product owner, je veux ajouter un nouveau type "Newsletter"
qui peut être publié et planifié, mais ne supporte ni commentaires, ni likes,
ni suppression (les newsletters restent archivées).
*/