8796 sujets

Développement web côté serveur, CMS

Bonjour tout le monde, je suis nouveau sur ce forum, malgré un certain temps de consultation de ce super site...

Je me décide en fin à réellement passer à l'objet et j'ai débuter la conception d'un CMS (Simple...), avec les caractéristiques suivantes :

* Totalement 'objet'
* Tout en français (Avec ultérieurement une 'internationalisation' en Anglais
* Un système de templates tiré de phpBB
* Un système de templates tiré de phpBB
* Un système de thèmes en XHTML strict et CSS 2.1
* ...

Dés que ce sera possible, je vous en communiquerai plus à ce sujet. Pour le moment, j'aurai besoin d'avis pro sur l'élaboration de ma classe d'accès à la BD... je connais pas trop mal les 'généralités de l'objet, mais bon j'ai tout de même de sacré doutes...
Voici un premier jus (Incomplet de ma classe de connexion :


<?php
 
class BD
{
	private $BD_Instance = null;
	private static $instance = null;
	
	private function __construct()
	{
		$this->BD_Instance = new PDO('mysql:dbname='.BD.';host='.HOST,USER,PASS);
	}
	 
	public static function getInstance()
	{
		if(is_null(self::$instance))
		{
			self::$instance = new BD();
		}
		return self::$instance;
	}
	
	public function query($query)
	{
		return $this->BD_Instancee->query($query);
	}
	
	public function prepare($query)
	{
		return  $this->BD_Instance->prepare($query);
	}
	
	public function lire($query)
	{
		$test = $this->BD_Instance->prepare($query);
		$test->execute();
		return $test->fetchAll();
	}
	
	public function ecrire($query,$array)
	{
		$test = $this->BD_Instance->prepare($query);
		$test->execute($array);
		return $test->fetchAll();
	}
}

	const USER	= 'root';
	const HOST	= 'localhost';
	const PASS	= '';
	const BD	= 'test';

	$test = BD::getInstance()->lire('SELECT nom FROM categories');
	echo '<pre>', print_r($test) ,'</pre>';
	

	BD::getInstance()->ecrire("INSERT INTO categories(nom) VALUES(:test)",array(':test'=>'Un autre tupple!'));


J'aurai aimé votre avis avant d'aller plus loin dans le développement... Smiley confus
Merci d'avance,
Stéphan
Pour le moment, ta classe est identique à un extends PDO avec un singleton Smiley ohwell
C'est un début, mais c'est très loin d'une classe DAO...

A titre d'exemple, pour mon fw, j'utilise:
- configuration séparée des identifiants (lecture yml / ini / xml au choix)
- raccourcis pour l'obtention des données (indexé par clef, hydraté...)
- gestion en fonction des identifiants (driver) d'une connexion sqlite, mysql, postgre, oracle
- ORM (dans l'absolu idéal)

Courage en tout cas.

Par contre, concernant l'histoire des thèmes, il serait bien plus avisé de partir direct dans du xHTML5 / CSS3... non ?
Si tu veux construire un Singleton ton constructer et ton cloner doivent être en accès privée. Parce qu'avec ton code on peut cloner ta classe et donc on perd l'unicité. Donc déjà il faut que tu regardes comment on implémente le motif Singleton correctement.

Ensuite si tu veux utiliser directement les méthodes de PDO dans ta classe, tu dois étendre la classe PDO et pas dupliquer toutes les méthodes une par une (surtout que t'en as oublié).
Modifié par jb_gfx (29 Aug 2011 - 16:05)
Yes, je sais pas pourquoi je l'ai vu publique. Smiley langue

PS : J'ai viré l'exemple qui servait à rien.
Modifié par jb_gfx (29 Aug 2011 - 15:51)
L'habitude, probablement.

En passant, ajout fortement appréciable en cas de multiples sources de données, prévois un singleton "profilé" (j'ignore si un pattern répond à ce besoin, je dois sans doute en ignorer le nom simplement):

class Exemple {
  const DEFAULT_PROFILE = 'default';
  
  protected static $singletons = array();

  public static function get($profile = null) {
    if($profile === null) { $profile = static::DEFAULT_PROFILE; }

    if(!array_key_exists($profile, self::$singletons)) {
      $cls = get_called_class();
      self::$singletons[$profile] = new $cls($profile);
    }

    return self::$singletons[$profile];
  }
}
Certains appellent ça un Multiton, mais ça reste le même principe. C'est ce j'utilise sur mon mini framework maison.

On peut prévoir aussi une méthode killInstance($profile); qui peut être pratique pour couper une connexion à une bdd explicitement (par exemple avant un traitement long qui ne sera pas suivi d'autres requêtes sur cette même base).

PS : Pourquoi tu utilises get_called_class(); plutôt que __CLASS__ ?

En passant j'ai un article sur mon blog qui parle du sujet :

http://nitak-studio.com/blog/2011/08/22/gerer-la-connexion-a-la-base-de-donnees-avec-le-patron-de-conception-singleton/
Modifié par jb_gfx (29 Aug 2011 - 16:34)
get_called_class() (ainsi que le mot-clef static) sont équivalents à __CLASS__ et self, à l'exception près que c'est du LSB (late static binding). La résolution de la classe courante ne sera faite que durant l'exécution (le plus tard possible), ce qui signifie que tu obtiens par ce biais les valeurs réelles, correspondantes à la classe de l'objet en court (et non à son patron, venant d'un éventuel parent).
http://php.net/lsb

Steven79, tu as tes pistes, du coup ?
Modifié par Lpu8er (29 Aug 2011 - 19:04)