8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,
J'ai posté un message il y a quelques temps, mais n'ayant pas eu de réponse me satisfaisant, je vais la réitérer en essayant d'être un plus clair cette fois.

http://uploads.siteduzero.com/files/245001_246000/245384.png

Voici un MCD illustrant une relation 0.N de chaque côté. Je voudrais transformer ça en PHP orienté Objet. Hors je bute à cet endroit-là.

1) Existe-il une méthodologie ?
2) Peut-on utiliser un Design Pattern, si oui lequel ?
3) Je ne sais pas vraiment quelle ligne directrice suivre. Tous les conseils sont les bienvenues.

Voici comment je suis parti pour l’instant

<?php
class Article{
    private $id;
    private $titre;

    function __construct($titre=null, $id=null) {
        $this->id = $id;
        $this->titre = $titre;
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getTitre() {
        return $this->titre;
    }

    public function setTitre($titre) {
        $this->titre = $titre;
    }
}
?>



<?php
require_once 'Mysql.php';
require 'Article.php';

class ManageArticle{
    public static function add(Article $article){
        $mysql = Mysql::getInstance();
        $mysql->query("insert into article(`titre`) VALUES ('".$article->getTitre()."')");
        $article->setId($mysql->insert_id());
        return true;
    }

    public static function getAll(){
        $mysql = Mysql::getInstance();
        $ress = $mysql->query("select * from article");

        $listArticle = array();
        while($data = $mysql->fetch($ress)){
            $listArticle[] = new Article($data['titre'], $data['description'], $data['id_article']);
        }
        return $listArticle;
    }
}
?>



<?php
class Boutique{
    private $id;
    private $nom;

    function __construct($nom=null, $id=null) {
        $this->id = $id;
        $this->nom = $nom;
    }

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNom() {
        return $this->nom;
    }

    public function setNom($nom) {
        $this->nom = $nom;
    }
}
?>



<?php
require_once 'Mysql.php';
require 'Boutique.php';

class ManageBoutique{
    public static function add(Boutique $boutique){
        $mysql = Mysql::getInstance();
        $mysql->query("insert into boutique(`nom`) VALUES ('".$boutique->getNom()."')");
        $boutique->setId($mysql->insert_id());
        return true;
    }

    public static function getAll(){
        $mysql = Mysql::getInstance();
        $ress = $mysql->query("select * from boutique");

        $listBoutique = array();
        while($data = $mysql->fetch($ress)){
            $listBoutique[] = new Boutique($data['nom'], $data['id_boutique']);
        }
        return $listBoutique;
    }
}
?>


Hors maintenant comment faire pour insérer et récupérer les objets dans ma table de jointure ?
Faut-il créer une autre classe ?
J’ai vu certaines personnes qui mettaient une liste d’article dans boutique et une liste de boutique dans Article, est-ce la meilleure solution ? J’aurais voulu avoir un couplage entre les classes le plus faible possible, pour pouvoir par exemple le liée à d’autres classes. Y a-t-il une façon plus adéquate pour mettre en place ceci ?

Je pensai faire comme ça :


<?php
require_once 'Mysql.php';

class ManageArticleBoutique{
    public static function add($article, $boutique){
        $mysql = Mysql::getInstance();
        $mysql->query("insert into j_article_boutique(`id_article`,`id_boutique`) VALUES ('".$article->getId()."', '".$boutique->getId()."')");
	return true;
    }

    public static function getByIdBoutique($idBoutique){
        $mysql = Mysql::getInstance();
        $ress = $mysql->query("select	a.id_article as a_id_article,
					a.titre as a_titre,
					b.id_boutique as b_id_boutique,
					b.nom as b_nom,
					    from article a, boutique b, j_article_boutique
					    where   b.id_boutique='".$idBoutique."' and
						    j_article_boutique.id_article=a.id_article and
						    j_article_boutique.id_boutique=b.id_boutique");

	$liste = array();
	$data = $mysql->fetch($ress);

	$boutique = new Boutique($data['b_nom'], $data['b_id_boutique']);
        $liste[]= new Article($data['a_titre'], $data['a_id_article']);
	while($data = $mysql->fetch($ress))
	    $liste[] = new Article($data['a_titre'], $data['a_id_article']);
        return array(0 => $boutique, 1 => $liste);
    }

    public static function getByIdArticle($idArticle){
        $mysql = Mysql::getInstance();
        $ress = $mysql->query("select	a.id_article as a_id_article,
					a.titre as a_titre,
					b.id_boutique as b_id_boutique,
					b.nom as b_nom,
					    from article a, boutique b, j_article_boutique
					    where   a.id_article='".$idArticle."' and
						    j_article_boutique.id_article=a.id_article and
						    j_article_boutique.id_boutique=b.id_boutique");

	$liste = array();
	$data = $mysql->fetch($ress);
	if($data==NULL)
	    return array(0 => NULL, 1 => $liste);

	$article = new Article($data['a_titre'], $data['a_id_article']);
        $liste[]= new Boutique($data['b_nom'], $data['b_id_boutique']);
	while($data = $mysql->fetch($ress))
	    $liste[] = new Boutique($data['b_nom'], $data['b_id_boutique']);
        
	return array(0 => $article, 1 => $liste);
    }
}
?>


Qu’en pensez-vous ?
En tout cas, merci par avance à tous pour vos conseils et idées.
Modifié par TaKiNeLiNfO (12 Jul 2010 - 19:01)
Ce que je peux te conseiller c'est de t'inspirer des ORM déjà existants.

L'un des meilleurs selon moi était Doctrine, qui est l'ORM par défaut du framework Symphony depuis la vers 1.2 ou 1.3 (le précédent étant Propel et qui est toujours disponible).
Tu trouveras sur le site de Doctrine une documentation bien expliqué qui te présentera le principe de fonctionnement et d'organisation des classes.

De manière générale, l'idée est d'avoir une classe abstraite "enregistrement" et une autre "table". La première représentant un enregistrement sous forme d'objet avec des méthodes de gestion des valeurs, d'enregistrement/modification/suppression, et la seconde représente une table de la BDD et qui sert entre autre à faire des requêtes de selection.

Le principe est d'étendre ces classes pour chacune des tables de ta BDD. Cela permet d'avoir une architecture modulaire et commune facilement personnalisable.
Bonjour,

j'ai exactement le même problème.
pouvez-vous m'aider si vous avez trouvé une solution?

merci beaucoup.