loicfrering / losolib

Collection of components for Zend Framework applications and integration of Symfony Components.
http://losohome.wordpress.com/
MIT License
48 stars 6 forks source link

Un peu de réflexion #4

Closed anardil closed 13 years ago

anardil commented 13 years ago

Bonjour,

Je me permet de parler en français car il me semble que tu es français aussi. Ce n'est pas vraiment un problème mais plutôt une réflexion. J'aimerai savoir comment récupérer le connexion courante ? Je peux très bien faire ceci : $oBootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); $em = $oBootstrap->getContainer()->em; $oConn = $em->getConnection();

Mais bon j'aimerai bien accéder à la connexion de manière directe. La question que je me pose à quel niveau je peux intégrer ceci dans ta classe LoSo_Doctrine_ORM_Tools_Dao_GenericDao ? ou alors au niveau du ServiceLayer LoSo_Doctrine_ORM_Tools_Service_GenericService ?

Autre question, j'ai l'impression que tes classes Services peuvent uniquement manipuler un seul DAO. J'ai du mal à me rendre compte de l'architecture sans un petit diagramme de classe. Pour moi UserService -> accède à -> UserDao -> accède au model -> User. Donc pour chaque model que je vais créer je vais devoir avoir un DAO et Service. Alors que pour moi un service doit être capable de manipuler plusieurs DAO et se sont les DAO qui devront avoir les toutes les méthodes nécessaire aux services. Donc je verrais plutôt une architecture avec peu de services, et autant de DAO que de models.

Qu'en penses-tu ?

loicfrering commented 13 years ago

Bonjour Anardil,

Tout à fait d'accord avec toi sur ta réflexion DAO/Services. D'ailleurs, je préfère plutôt utiliser le terme Repository plutôt que DAO et je vais certainement compléter le GenericDao d'un GenericRepository : le GenericDao et le GenericService sont vraiment dédié aux architectures en couches très verticales.

Actuellement ce que je fais c'est que je crée des Repositories pour mes entité (ex : UserRepository) et j'injecte diretement ces repositories dans mes controllers ou mes services. Tu trouveras un exemple rapide dans ce gist.

En ce qui concerne la récupération de la connexion, je ne sais pas si j'ai bien compris ton problème, mais si tu es dans un classe qui hérite de GenericDao, tu peux faire :

$this->_em->getConnection();

Sinon dans n'importe quelle classe tu peux injecter l'EntityManager pour récupérer la connexion :

<?php
/** @Service */
class MyService
{
    private $em;

    /** @Inject */
    public function __construct($em)
    {
        $this->em = $em;
    }

    // ...

    public function myMethod()
    {
        $connection = $this->em->getConnection();
    }
}

J'espère répondre à tes question et réflexions, n'hésite pas si tu as d'autres remarques !

loicfrering commented 13 years ago

J'ai fait un refactoring qui vont dans le sens de notre discussion : e98481d56b1869cfe891c76d0ee30bb8f0cb77e4. Je vais donc clore cette issue, n'hésite pas à me faire tes éventuels retours !