Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-11-2011 20:50:44

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

[zf2.0beta1] containers d'injection de dépendance

Bonjour,
je ne comprends pas encore toute la subtilité des containers d'injection de dépendance mais voici ma 1ere expérience pour utiliser ce design pattern.
Je me suis appuyé sur :
http://packages.zendframework.com/docs/ … start.html

Utilisation sans container:

Code:

$userService = new \User\Model\Service\UserService($this->getEntityManager());
=> le constructeur suivant est appelé:

protected $_em = null;
public function __construct(EntityManager $em) {
    $this->_em = $em;
}

Utilisation avec container:

Code:

$userService = $this->getLocator()->get('User\Model\Service\UserService',array('em'=>$this->getEntityManager()));

=> 1 - TOUS les setters de la classe User\Model\Service\UserService sont appelés
     2 - Les paramètres de ces setters portant le nom 'em' sont remplacés par la valeur $this->getEntityManager()

Donc pour obtenir le comportement de l'exemple ci dessus (utilisation sans container) on peut écrire le setter ci dessous:

Code:

protected $_em = null;
    public function setEntityManager(EntityManager $em)
    {
        $this->_em = $em;
    }

Et on peut virer le constructeur car il ne sert plus à rien.

Dernière modification par booradley (28-11-2011 21:34:55)

Hors ligne

 

#2 28-11-2011 22:14:19

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: [zf2.0beta1] containers d'injection de dépendance

Même pas de question ? Je suis déçu booradley sad...

Hors ligne

 

#3 28-11-2011 22:33:20

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0beta1] containers d'injection de dépendance

patience Bakura, je suis un peu fiévreux en ce moment...

lol

Hors ligne

 

#4 30-11-2011 22:43:54

booradley
Membre
Date d'inscription: 10-01-2009
Messages: 163

Re: [zf2.0beta1] containers d'injection de dépendance

Imaginons qu'on appelle une méthode d'un service qui elle même appelle une autre méthode d'un autre service.
Voici ce que je fais:

Code:

namespace Application\Model\Service;

class PremierService {
protected $_em = null;    
protected $secondService = null;

    public function setEntityManager(EntityManager $em)
    {
        // ce setter est appelé par le container car il contient une variable nommée $em dans sa signature
        $this->_em = $em;
    }    
    public function __construct(\Application\Model\Service\SecondService $secondService)
    {
       // ce constructeur est toujours appelé par le container
       // il instancie automatiquement tous les paramètres
        echo "classe secondService dépend de premierService";
        $this->secondService = $secondService ;
    }
    public function autremethode($params) {
       return $this->secondService->methodeSecondService($params);
    }
}

Comme toutes mes classes de service ont besoin de l'entityManager, je déplace ma méthode setEntityManager dans une classe CommonService avec laquelle j'étend toutes mes classes de service.
Ensuite j'appelle ma méthode avec:

Code:

$premierService = $this->getLocator()->get('Aplication\Model\Service\PremierService',array('em'=>$this->getEntityManager()));
$result = $premierService->autremethode($mesparams);

On s'apercoit qu'on a pas besoin d'instancier SecondService, le container s'en charge.
De plus l'objet secondService à maintenant directement accès à $_em ce qui fait qu'il n'est plus nécessaire de le propager dans ses méthodes.

Voilà ce que je fais en attendant d'avoir une meilleure vision du truc.
Car ce système est censé améliorer le découplage mais vu le code j'en suis pas convaincu...
Bref toutes les remarques sont les bienvenues.

Dernière modification par booradley (01-12-2011 10:31:00)

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