Bonjour,
Je suis actuellement en train de concevoir un produit maison entre le frameWork et le CMS bas� sur le design pattern MVC.
L'id�e est d'impl�menter une classe g�n�rique poss�dant les m�thodes CRUD (Create Read Update Delete), qu'on puisse r�utiliser avec le moins de code possible dans des objets m�tiers ... la POO est faite pour me direz vous!
Certes mais je trouve ca encore un peu lourd, et ce parce que je dois faire passer les noms de bases de donn�es et de tables � chaque m�thode h�rit�e... et comme je ne suis pas brillant en POO, je souhaiterai des vais �clair�s.
Donc c du PHP5 & PEARB et voici le code de la classe g�n�rique
l'id�e est d'�crire le moins de SQL possible. dans la plupart des cas $data est en fait $_GET ou $_POST et la petite fonction quoteAndSerialize (que j'aimerai bien avoir comme m�thode plutot que comme fonction globale) s'occupe du reste ... l'int�r�t (que j'y trouve en tout cas ;-)) est qu'une modification d'un attribut de l'objet qui h�rite de ces m�thodes n�cessite une modification au niveau de la table dans le SGBD et une au niveau du template du formulaire.
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 <? require_once 'DB.php'; abstract class mfw_dao { public function __construct($id,$dataBase,$table){ $db = connect($dataBase); $result = $db->query("SELECT * FROM ".$table." WHERE id=".$id.";"); foreach ($result->fetchRow(DB_FETCHMODE_ASSOC) AS $key => $value) $this->$key=$value; } public static function create($data,$dataBase,$table){ $SQL_SET = quoteAndSerialize($data,$dataBase,$table); $db = connect($dataBase); $db->query("INSERT INTO ".$table." SET ".$SQL_SET); return mysql_insert_id(); } public static function liste($dataBase,$table){ $db = connect($dataBase); return $db->getAll("SELECT * FROM ".$table.";",DB_FETCHMODE_OBJECT); } public function update($data,$dataBase,$table){ $SQL_SET = quoteAndSerialize($data,$dataBase,$table); $db = connect($dataBase); //die("UPDATE ".$table." SET ".$SQL_SET." WHERE id=".$this->id); return $db->query("UPDATE ".$table." SET ".$SQL_SET." WHERE id=".$this->id); } public function delete($dataBase,$table){ $db = connect($dataBase); return $db->query("DELETE FROM ".$table." WHERE id=".$this->id.";"); } } /************************************/ /* FONCTIONS GLOBALES */ /************************************/ function quoteAndSerialize($data,$dataBase,$table){ $type2Quote=Array('blob','text','string','date'); $db = DB::connect("mysql://".USER_DB.":".PASS_DB."@".HOST_DB."/".$dataBase); $info = $db->tableInfo($table); foreach($data AS $attribut => $value){ foreach($info AS $key => $lgnCreate){ if($info[$key]['name']== $attribut && $attribut!='id'){ $type[$attribut]=$info[$key]['type']; $data4upd[$attribut]=$value; } } } $SQL_SET=""; foreach($data4upd AS $attribut => $value){ if(in_array($type[$attribut],$type2Quote)) $SQL_SET.=" ".$attribut." = \"".$value."\","; else $SQL_SET.=" ".$attribut." = ".$value.","; } $SQL_SET=substr($SQL_SET,0,strlen($SQL_SET)-1); return $SQL_SET; } function connect($dataBase){ return DB::connect("mysql://".USER_DB.":".PASS_DB."@".HOST_DB."/".$dataBase); } ?>
Maintenant voici comment j'utilise cette classe abstraite pour un objet m�tier (ici des revues)
getObj est une fonction globale qui me permet de ne pas me pr�occuper du path de mes objets ...<?
getObj('mfw_dao');
class journal extends mfw_dao{
private static $dataBase = DATABASE;
private static $table = 'journal';
public function __construct($id){
parent::__construct($id,self::$dataBase,self::$table);
}
public static function create($data){
return parent::create($data,self::$dataBase,self::$table);
}
public static function liste(){
$db = connect(self::$dataBase);
return $db->getAll("SELECT * FROM ".self::$table." ORDER BY titre ASC;",DB_FETCHMODE_OBJECT);
}
public function update($data){
return parent::update($data,self::$dataBase,self::$table);
}
public function delete(){
return parent::delete(self::$dataBase,self::$table);
}
}
?>
en gros ce que j'aimerai c ne pas avoir � d�clarer explicitement les m�thodes CRUD dans les objets m�tiers (h�rit�s). Toute les suggestions sont les bienvenues!
D'avance merci � tous
Partager