Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Regarde ici, il me semble qu'il y a une intégration de Doctrine 2
http://github.com/loicfrering/losolib
Hors ligne
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 merci.
Dernière modification par Moimeme (22-07-2010 15:25:59)
Hors ligne
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
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
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 :
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 :
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
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).
<?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.
Hors ligne
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?
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
Bonsoir,
Oui c'est dans le bootstrap, il faut ajouter le helper dans le gestionnaire de helpers (broker), par exemple :
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 :
class FooController extends Zend_Controller_Action { public function init() { $this->_helper->getHelper('Di')->disable(); } //... }
A+ benjamin
Hors ligne
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
/** * Disable IOC * To be called from action controllers */ public function disable() { $this->_disable = true; }
Il faudrait plutot
/** * 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
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
C'est bien:
/** * 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
A+ benjamin.
Hors ligne
Ou en utilisant CPD
Hors ligne
Pour ma part, le dépendances sont chargées dans le bootstrap de cette manière
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
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.
Hors ligne
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
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.
Hors ligne
<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