Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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:
$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:
$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:
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
Même pas de question ? Je suis déçu booradley ...
Hors ligne
patience Bakura, je suis un peu fiévreux en ce moment...
lol
Hors ligne
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:
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:
$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
Pages: 1