Je viens de commencer l'objet, et j'ai créé un mini système de news tout bête, et je voudrai avoir votre avis :
index.php
Code : Tout sélectionner
<?php
$db = new PDO('mysql:host=localhost;dbname=db_name;charset=utf8', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
function autoload($class)
{
require $class . '.php';
}
spl_autoload_register('autoload');
$manager = new NewsManager($db);
$liste = $manager->getList();
if ($_POST) {
if (!empty($_POST['titre']) && !empty($_POST['contenu']) && !empty($_POST['auteur'])) {
$titre = htmlspecialchars($_POST['titre']);
$contenu = htmlspecialchars($_POST['contenu']);
$auteur = htmlspecialchars($_POST['auteur']);
$news = new News([
'titre' => $titre,
'contenu' => $contenu,
'auteur' => $auteur
]);
if (!$news->titreValide()) {
$message = 'Le titre de l\'article doit être une chaine de caractères de maximum 255 caractères';
unset($news);
} elseif (!$news->contenuValide()) {
$message = 'Le contenu de l\'article doit être une chaine de caractères';
unset($news);
} elseif (!$news->auteurValide()) {
$message = 'L\'auteur de l\'article doit être une chaine de caractères de maximum 50 caractères';
unset($news);
} else {
$manager->addNews($news);
$message = 'News ajoutée avec succès';
}
} else {
$message = 'Veuillez complèter tout les champs';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Les news</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<h1>Toutes vos news</h1>
<div class="liste">
<?php
foreach ($liste as $news) {
echo '<div class="news">';
echo '<b>' . $news->auteur() . '</b> a écrit : <i>"' . $news->titre() . '"</i><br/>';
echo '<p>' . $news->contenu() . '</p>';
echo '</div>';
}
?>
</div>
<div class="message">
<?php
if (!empty($message)) {
echo $message;
}
?>
</div>
<form method="post" action="" class="form_news">
<fieldset>
<legend>Ajouter une news</legend>
<div class="form_element">
<input type="text" name="titre" maxlength="255" placeholder="titre"/>
</div>
<div class="form_element">
<textarea name="contenu" placeholder="contenu"></textarea>
</div>
<div class="form_element">
<input type="text" name="auteur" maxlength="50" placeholder="auteur"/>
</div>
<div class="form_element">
<input type="submit" value="Ajouter"/>
</div>
</fieldset>
</form>
</body>
</html>
Code : Tout sélectionner
<?php
class News
{
private $_id,
$_titre,
$_contenu,
$_auteur;
public function __construct(array $data)
{
$this->hydrate($data);
}
public function hydrate(array $data)
{
foreach ($data as $key => $value) {
$method = 'set' . ucfirst($key);
if (method_exists($this, $method)) {
$this->$method($value);
}
}
}
// GETTERS
public function id()
{
return $this->_id;
}
public function titre()
{
return $this->_titre;
}
public function contenu()
{
return $this->_contenu;
}
public function auteur()
{
return $this->_auteur;
}
// SETTERS
public function setid($id)
{
$id = (int)$id;
if (is_int($id) && $id > 0) {
$this->_id = $id;
} else {
trigger_error('ID DOIT ETRE DE TYPE INT ET SUPERIEUR A 0', E_USER_ERROR);
return false;
}
}
public function setTitre($titre)
{
if (is_string($titre)) {
$this->_titre = $titre;
} else {
trigger_error('TITRE DOIT ETRE DE TYPE STRING', E_USER_ERROR);
return false;
}
}
public function setContenu($contenu)
{
if (is_string($contenu)) {
$this->_contenu = $contenu;
} else {
trigger_error('CONTENU DOIT ETRE DE TYPE STRING', E_USER_ERROR);
return false;
}
}
public function setAuteur($auteur)
{
if (is_string($auteur)) {
$this->_auteur = $auteur;
} else {
trigger_error('AUTEUR DOIT ETRE DE TYPE STRING', E_USER_ERROR);
return false;
}
}
public function titreValide()
{
if (!empty($this->titre()) && is_string($this->titre()) && strlen($this->titre()) < 256) {
return true;
} else {
return false;
}
}
public function contenuValide()
{
if (!empty($this->contenu()) && is_string($this->contenu())) {
return true;
} else {
return false;
}
}
public function auteurValide()
{
if (!empty($this->auteur()) && is_string($this->auteur()) && strlen($this->auteur()) < 51) {
return true;
} else {
return false;
}
}
}
Code : Tout sélectionner
<?php
class NewsManager
{
private $_db;
public function __construct($db)
{
$this->setDb($db);
}
public function setDb(PDO $db)
{
$this->_db = $db;
}
public function addNews(News $news)
{
$q = $this->_db->prepare('INSERT INTO news(titre, contenu, auteur) VALUES (:titre, :contenu, :auteur)');
$q->bindValue(':titre', $news->titre(), PDO::PARAM_STR);
$q->bindValue(':contenu', $news->contenu(), PDO::PARAM_STR);
$q->bindValue(':auteur', $news->auteur(), PDO::PARAM_STR);
$q->execute();
$news->hydrate([
'id' => $this->_db->lastInsertId()
]);
}
public function getList()
{
$q = $this->_db->query('SELECT * FROM news ORDER BY id DESC LIMIT 0,50');
$q->execute();
$liste = array();
while ($data = $q->fetch(PDO::FETCH_ASSOC)) {
$liste[] = new News($data);
}
return $liste;
}
}
Pour contrôler l'intégrité des données d'une news, j'utilise des méthodes du type "titreValide", néamoins, j'ai déjà mes setters qui vérifient (en partie), l'intégrité des données. La question, ces méthodes sont-elles appropriées ou y a t-il une meilleur manière de contrôler les données, comme par exemple directement contrôler les données dans le contrôleur sans utiliser des méthodes..
Merci d'avance