Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Voila j'ai encore un peu de mal à prendre les bonne décisions et comprendre le service manager. Depuis le Controller je récupére un service manager. Ca ok, ça marche.
Par contre j'aimerais récupérer l'adaptater de ma DB qui est déclaré en Service dans une classe métier.
Car pour chaque objet A je veux avoir une méthode me permettant de récupérer un objet B qui lui est lié.
Donc je passe à ma vue un resultset d'objet A, mais je veux pouvoir dans ma vue appeller la méthode de A me retournant l'objet B qui lui est lié.
Je sais pas si je suis claire
Hors ligne
J'ai déjà répondu à cette question. La réponse est dans ce forum et facilement trouvable.
Hors ligne
si c'est le topic que je pense, j'ai vu mais j'ai pas eu l'impression que la réponse correspondait. Je vais de ce pas compléter le thread
En espérant que ce soit celui là : http://www.z-f.fr/forum/viewtopic.php?id=8208
Dernière modification par mtcocktail (24-11-2012 17:33:41)
Hors ligne
Je reviens un peu sur mon problème car je ne trouve pas la solution.
Je pourrais injecter l'adaptater dans ma classe à partir du controller, mais dans ce cas là ce n'est pas possible.
On a les classe d'abstraction tablegateway qui font les requête et me renvoie un resultset associé à mon objet métier.
Je passe ce resultset à ma vue.
Dans ma vue je fais une boucle sur ce resultset qui via l'iterator va m'instancié mon objet métier. et c'est dans cette objet métier que j'aimerais faire une requête. Ou alors dans cette boucle qui est dans ma vue, pour chaque element instancier un autre element. Mais comme je ne suis plus dans contrôleur je ne voies pas comment passer mon adaptater.
J'immagine que je ne suis pas très clair
Hors ligne
Non ce n'est pas très clair. Ce que je vois à première vue c'est qu'il y a un problème dans les données que tu envoies à ta vue car tu ne dois pas faire de requête dans celle-ci (enfin c'est déconseillé ou alors via des view helpers qui font appel à des services ^^) !
Hors ligne
J'essaye de formuler alors un exemple plus simple
Comment tu ferais si tu dois afficher dans une vue :
Une liste d'objet A, et pour chaque objet A de cette liste la liste d'objet B associé à A.
Hors ligne
Via un getter dans l'objet A vers l'objet B, enfin avec Doctrine c'est comme ça que l'on fait. Dans la requête on récupère tout ce dont on a besoin via des jointures etc ... donc tout est "chargé" dans la couche service et dans la vue on récupère simplement un gros objet qui contient l'objet A et l'objet B avec une référence de A vers B via un getter.
Le problème que tu vas rencontrer si tu fais la requête dans la boucle c'est que si tu as 10 éléments et que pour chacun de ces éléments tu veux récupérer l'élément B tu feras 10 requêtes, si tu en as 100 => 100 requêtes et là ça fait vraiment beaucoup. Donc tu dois trouver une façon de faire pour charger tous les éléments B d'un coup en même temps que les éléments A.
Hors ligne
je veux pouvoir dans ma vue appeller la méthode de A me retournant l'objet B qui lui est lié.
En simplifiant à l'extrême, dans ton objet A :
$this->B = new B($A->idDeB);
ou
public function getB($A->idDeB){...}
Où est le problème dans ta vue ?
$A->B->proprieteDeB
ou
$A->getB()->proprieteDeB
Hors ligne
oui pour la simplification à l'extreme Et justement dans mon objet B comment je fais pour binder les variable de B avec les valeurs de la base. Je pourrais faire une requête, mais dans le constructeur de B je n'ai pas accès à l'adaptater disponible dans le service manager de l'application.
Orkin : je suis d'accord sur le problème de trop de requête, mais ça veut dire ne pas utiliser de tablegateway, et tous refaire non ?
Hors ligne
mtcocktail a écrit:
mais dans le constructeur de B je n'ai pas accès à l'adaptater disponible dans le service manager de l'application.
Si justement dans le topic précité plus haut.
Hors ligne
mtcocktail a écrit:
Orkin : je suis d'accord sur le problème de trop de requête, mais ça veut dire ne pas utiliser de tablegateway, et tous refaire non ?
Je ne sais pas j'utilise Doctrine et on peut faire ce genre de chose très facilement.
Donc essai de voir la solution de Bouks.
Hors ligne
Donc l'idée du toptic précité c'est d'avoir sa propre class adapter et changer dans le code l'appel à l'adapter automatique qu'on a avec :
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
Hors ligne