IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] class abstraite CRUD & DAO


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [POO] class abstraite CRUD & DAO
    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
    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);
    }	
     
    ?>
    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.
    Maintenant voici comment j'utilise cette classe abstraite pour un objet métier (ici des revues)
    <?
    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);
    }
    }
    ?>
    getObj est une fonction globale qui me permet de ne pas me préoccuper du path de mes objets ...
    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

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    quoteAndSerialize (que j'aimerai bien avoir comme méthode plutot que comme fonction globale)
    Qu'est ce qui t'en empeche ?

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Non testé : (faudrait p'tet que je me mette à php5 un de ces jours...)
    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
    class A {
       protected $table;
       function __construct($table) {
          $this->table = $table;
       }
     
       function CRUD() {
          $db->CRUD('SELECT crud FROM '. $this->table);
       }
    }
     
    class B extends A {
       function __construct() {
          parent::__construct('journal');
       }
    }

Discussions similaires

  1. [POO] Classe abstraite et attributs
    Par Info-Rital dans le forum Langage
    Réponses: 1
    Dernier message: 12/08/2007, 13h28
  2. [POO] classe abstraite sans methode
    Par ZaaN dans le forum C++
    Réponses: 7
    Dernier message: 01/05/2007, 19h21
  3. [POO] Classe abstraite PHP5 et variables membres
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 01h27
  4. [POO] Classes abstraites
    Par GLDavid dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2006, 11h18
  5. [POO] class abstraite et methode magic
    Par jeff_! dans le forum Langage
    Réponses: 14
    Dernier message: 24/01/2006, 23h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo