Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#51 22-07-2010 14:48:20

dev-k
Membre
Lieu: Barcelona
Date d'inscription: 18-07-2009
Messages: 77
Site web

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Regarde ici, il me semble qu'il y a une intégration de Doctrine 2
http://github.com/loicfrering/losolib

Hors ligne

 

#52 22-07-2010 15:22:35

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

ok, sinon pour revenir au sujet principal j'ai du mal a bien voir la différence entre controller et service.
Quoi mettre dans l'un et dans l'autre et surtout comment faire cette couche service.
Un petit exemple de code serait bienvenue smile merci.

Dernière modification par Moimeme (22-07-2010 15:25:59)

Hors ligne

 

#53 17-03-2011 09:28:15

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Bonjour, j'essai (difficilement) de comprendre tout ceci et, j'en suis au tout debut

Pour ce qui est de l'injection en elle même, c'est un helper, un peu moins propre lui, peut-être une partie à revoir.

Du coup je fais comme ça

Code:

class Tight_Controller_Action extends Zend_Controller_Action
{
    public function init()
    {
        $di = $this->_helper->getHelper('Di');
    }
}

Es la bonne methode?

Merci et bonne journée

Dernière modification par lil-works (17-03-2011 10:17:30)

Hors ligne

 

#54 17-03-2011 17:37:04

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Bonjour,

lil-works a écrit:

Du coup je fais comme ça

Code:

class Tight_Controller_Action extends Zend_Controller_Action
{
    public function init()
    {
        $di = $this->_helper->getHelper('Di');
    }
}

Es la bonne methode?

Merci et bonne journée

Tu fais comme ça ? c'est à dire ? Pour faire quoi ?

Tu ne devrais pas implémenter de classe Tight_Controller_Action. Le helper Di n'est utilisé que pour injecter dynamiquement et récursivement les dépendances (comprendre "les classes utilisées par") de ton contrôleur.

L'idée toute simple derrière l'injection de dépendances est qu'au lieu de créer des dépendances en dur dans le code, de cette manière :

Code:

public function doSomethingAction()
{
    $user = new Model_User();
    $user->firstname = 'Benjamin';
    
    $userService = new Service_User();
    $userService->createUser($user);
}

public function doSomethingElseAction()
{
    $userService = new Service_User();
    $user = $userService->getUserByLogin('Delprog');
    
    $this->view->user = $user;
}

On injecte la dépendance dans le contrôleur directement :

Code:

protected $_userService;

public function setUserService(Service_User $userService)
{
    $this->_userService = $userService;
}

public function doSomethingAction()
{
    $user = new Model_User();
    $user->firstname = 'Benjamin';
    
    $this->_userService->createUser($user);
}

public function doSomethingElseAction()
{
    $user = $this->_userService->getUserByLogin('Delprog');
    
    $this->view->user = $user;
}

Voilà, j'ai fait de l'inversion de contrôle smile
On voit tout de suite que c'est beaucoup plus flexible, parce que je n'aurais pas des dizaines de dépendances créées en dur (avec new) un peu partout dans mon application.

L'injection de dépendances quand à elle consiste à injecter la dépendance au runtime, dynamiquement, en s'appuyant sur la configuration de l'utilisateur. C'est à ça que sert le helper Di, tu n'as pas à le manipuler directement. Le helper va récupérer le conteneur de dépendances (ici Tight_Di), et lui demande d'injecter récursivement toutes les dépendances en partant du contrôleur courant.

De cette façon, si je veux changer l'implémentation de mon service Service_User qui doit être utilisée c'est très facile. Je n'ai qu'à le changer dans la configuration de mon conteneur de dépendances (DIC).

Code:

<?xml version="1.0" encoding="UTF-8"?>
<components>
    <component id="indexController" class="IndexController">
        <property name="userService" ref="userService" />
    </component>

    <component id="userService" class="Service_Impl_User">
</components>

Grâce à l'IOC et l'injection de dépendances, je peux changer très facilement les classes utilisées par d'autres classes, et sans toucher une seule ligne de code.

Soit dit en passant, utiliser un helper est un peu "sale", mais c'est bien plus simple que de modifier le Front controller de ZF pour faire ça au moment de l'instanciation du contrôleur d'actions. En fait l'utilisation de l'IOC dans ZF est biaisée parce que le framework n'est pas du tout pensé pour ça. Si c'était le cas, tout passerait par un conteneur de dépendances. Au moins, avec cette solution, tu peux utiliser le concept pour tes propres classes, et rendre plus flexible la partie de l'application que tu maitrises.

Pour plus d'informations je t'invite à lire ce billet : http://code.anonymation.com/zend-framew … plication/

Le principe est vraiment très simple, j'imagine que c'est surtout que tu dois te mélanger un peu les pinceaux avec toutes les informations qui te sont données d'un coup dans ce topic.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#55 24-03-2011 18:44:18

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Merci de ta reponse et surtout merci pour ton blog...

Je comprend bien la logique d'injection, mais je ne vois pas à quel moment et comment tu dis à l'application de "passer" par ton helper Di
Dans le bootstrap?

Dans l'init du controller comme ça?

Code:

    public function init()
    {
        /* Initialize action controller here */
        $this->_helper->Di();
        
    }

Ma question montre surement l'ampleur de mes lacunes mais vraiment je ne vois pas!

Dernière modification par lil-works (24-03-2011 18:53:46)

Hors ligne

 

#56 28-03-2011 19:22:49

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Bonsoir,

Oui c'est dans le bootstrap, il faut ajouter le helper dans le gestionnaire de helpers (broker), par exemple :

Code:

protected function _initHelpers()
{        
    Zend_Controller_Action_HelperBroker::addHelper(new Tight_Controller_Action_Helper_Di());
}

Ensuite tu n'as rien d'autre à faire, sachant que tu peux désactiver le helper pour certains contrôleurs si tu n'en as pas besoin :

Code:

class FooController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->getHelper('Di')->disable();
    }

    //...
}

A+ benjamin


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#57 29-03-2011 00:53:11

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Merci de ta réponse
Cependant, je n'arrive pas à désactiver l'helper.
Les dépendances sont chargées lors du bootstrap et peu importe que je les désactives dans l'init du controller cela n'a aucun effet.

Note:
Je sais pas si j'ai rêvé mais il y a une erreur dans  Tight_Controller_Action_Helper_Di

Code:

    /**
     * Disable IOC
     * To be called from action controllers
     */
    public function disable()
    {        
        $this->_disable = true;
    }

Il faudrait plutot

Code:

    /**
     * Disable IOC
     * To be called from action controllers
     */
    public function disable()
    {        
        $this->_enabled = false;
    }

Dernière modification par lil-works (29-03-2011 00:53:40)

Hors ligne

 

#58 30-03-2011 10:06:44

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Hello,

Oui il s'agit d'une horrible erreur que je n'avais pas vu (copier/coller) parce que je n'ai jamais désactivé le helper haha smile

C'est bien:

Code:

    /**
     * Disable IOC
     * To be called from action controllers
     */
    public function disable()
    {        
        $this->_enabled = false;
    }

Ça m'apprendra à ne pas couvrir tout le code par des tests unitaires smile

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#59 30-03-2011 10:14:47

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Ou en utilisant CPD wink


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#60 30-03-2011 14:55:45

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Pour ma part, le dépendances sont chargées dans le bootstrap de cette manière

Code:

protected function _initHelpers()
    {        
        Zend_Controller_Action_HelperBroker::addHelper(new Tight_Controller_Action_Helper_Di());
    }

Cependant, après la desactivation dans l'init d'un controller les dépendances sont deja chargée et le ->disable() est sans effet

Hors ligne

 

#61 30-03-2011 15:40:32

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Ce n'est pas la ligne de code que tu décris qui charge les dépendances. Ce code ne fait qu'enregistrer le helper auprès du gestionnaire d'aides. Ce qui fait qu'il sera automatiquement exécuté au moment du dispatch des contrôleurs d'actions.

Le chargement des ressources est assuré par Zend_Application et l'instance ainsi créée est donnée au conteneur (Tight_Di).

Tight_Di ne fait que charger des fichiers XML, tracer une map des dépendances sous forme d'array et récupérer ou servir les instances que lui a filé Zend_Application.

Le helper Di ne sert qu'à déclencher l'injection récursive des dépendances (et pour ça il fait appel à Tight_Di) et rien d'autre. Ça n'a rien à voir avec le chargement même des dépendances.

Le disable() est un tout petit tweak qui évite d'analyser le nom du contrôleur et de tenter d'injecter des dépendances pour rien. C'est un gain de performances, mais vraiment imperceptible.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#62 30-03-2011 15:56:58

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Merci de cette precision

Maintenant j'essai d'implementer le lazy loding:

Mais comment mettre en place le "Lazy-load" si les objets ne doivent rien connaitre de la persistance ? J'ai décidé d'utiliser le pattern Proxy.

Est-il possible d'avoir un exemple?

Hors ligne

 

#63 30-03-2011 20:59:51

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

Bonsoir,

Tu peux jeter un coup d'oeil à ce thread : http://www.z-f.fr/forum/viewtopic.php?id=3916
J'explique ce dont je parle dedans.

(Attention, le code du premier message n'est pas bon, faut bien lire et prendre le code à partir du 2ème message)

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#64 30-03-2011 22:04:45

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: [Partage/Reflexion]MVC, Services, Mapper et Persistance

<component id="mapper" class="Model_Db_Mapper">
        <property name="db" ref="db" />
        <property name="template" ref="modeltemplate" />
    </component>

J'ai beaucoup de mal à voire ce que doit contenir la classe Model_Db_Mapper Et-il possible d'avoir le code de cette classe?
Cette classe doit elle étendre Tight_Model_Db_Mapper?

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages