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:
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:
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:
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 ?