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