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 - Bien penser ses managers


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut POO - Bien penser ses managers
    Bonjour,

    Admettons que j'ai une simple class user comme suit :

    *** tout le code que je donne est écrit à la volé à titre d'exemple et ne vient pas d'un vrai projet ***

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class CUser
    {
       protected $_id;
       protected $_nom;
       protected $_prenom;
       protected $_entreprise_id;
       // avec les accesseurs qui vont bien
       // plus les méthodes suivantes :
       public function SetEntrepriseID($id) {$this->_entreprise_id = intval($id);}
       public function GetEntreprise() {...} // retourne un object CEntreprise
    }
    et une class entreprise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CUser
    {
       protected $_id;
       protected $_nom;
       // avec les accesseurs qui vont bien
    }
    Je souhaite gérer l'hydratation de ces class via des managers qui se chargeront de récupérer les données dans la BDD.
    Actuellement, je pense a des class ordinaires

    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
     
    class ManagerEntreprise
    {
       protected $bdd;
       public function __construct(PDO $bdd) {$this->bdd = $bdd;}
       public function Load(CEntreprise & $e)
      {
          $s = $this->bdd->prepare('select * from entreprise where id = :id');
          $s->execute(array(':id' => $e->GetID()));
          $res = $s->fetch();
          {
             $e->setNom($res['nom']);
          }
          $s->closeCursor();
      }
      //...
    }
     
    class ManagerUser
    {
       protected $bdd;
       public function __construct(PDO $bdd) {$this->bdd = $bdd;}
       public function Load(CUser & $u)
      {
          $s = $this->bdd->prepare('select * from user where id = :id');
          $s->execute(array(':id' => $u->GetID()));
          $res = $s->fetch();
          {
             $u->setNom($res['nom']);
             $u->setPrenom($res['prenom']);
             $u->SetEntrepriseID($res['entreprise_id']);
          }
          $s->closeCursor();
      }
      //...
    }
    Tant que je suis dans le main(), aucun problème puisque ma BDD que je ne veut pas mettre dans un singleton est disponible (je risque d'avoir à taper dans plusieurs BDD au cours du projet).

    Par contre, quand je veux rédiger la méthode CUser::GetEntreprise() qui est censée me retourner un objet de type CEntreprise, j'ai un problème puisque je n'ai pas connaissance de la BDD dans cette méthode, et je ne peut donc créer ni utiliser mon ManagerEntreprise pourtant nécessaire pour hydrater l'objet à retourner...

    Je ne peux qu'en déduire que mon architecture est mal pensée...

    Connaissez-vous une solution élégante à ce problème ?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Dans mes projets j'utilise un Registry. C'est un design pattern qui cache un simple objet global dans lequel tu stock ce que tu veux et que les autres objets peuvent interroger à loisir. Une implémentation connue est celle du ZendFramework : http://framework.zend.com/manual/1.1...try.using.html

    Pour faire simple dans ton code à un moment tu vas faire quelques chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Registry::set('SQL',$pdo);
    Puis dans CUser::GetEntreprise() tu as juste à appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pdo = Registry::get('SQL');
    $pdo->query('...');
    Après comme toutes variables globales , il faut l'utiliser en connaissance de cause et ne pas en abuser.

    Un article sur le sujet :
    http://www.croes.org/gerald/blog/les...ry-en-php/361/

    L'autre solution est de garder une référence du manager dans ton objet métier , mais tu vas induire un couplage fort entre les deux classes.

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Merci d'avoir pris un peu de temps pour me répondre.

    Avec ce DP, ne retombe t-on pas sur les inconvénients du singleton (forte interdépendance entre les class et intestabilité) ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Là comme ça je vois pas de solution pour faire du lazy loading sans ajouté une dépendance.
    Soit tu passes par un équivalent du Registry soit tu injecte ta dépendance en paramètres de ta méthode.

    Ça peut valoir le coup de voir comment fonctionne les ORM connus qui implémentent du lazy loading , y'a sans doute de bonnes idées à prendre.

Discussions similaires

  1. Comment "bien" faire ses CSS
    Par sliderman dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 30/06/2008, 21h38
  2. Comment bien créer ses applications Web?
    Par fflorever dans le forum SharePoint
    Réponses: 1
    Dernier message: 26/03/2008, 11h17
  3. Bien construire ses classes
    Par hunter99 dans le forum C++
    Réponses: 3
    Dernier message: 25/12/2007, 03h31
  4. Bien positioner ses fieldset
    Par InoX.ArG dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 16/07/2007, 20h36
  5. Bien faire ses sauvegardes
    Par Pigoulou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 04/01/2005, 09h20

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