Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Dans le cadre d'un futur projet sur le framework Zf2, je cherche à mettre en place des petits outils qui me simplifieront le développement, et je travail actuellement sur la création d'une classe modèle mère (qui sera dédié au contrôleur dans lequel je travail).
Par défaut , je ne compte pas utiliser d'ORM ou les classes dédiées du framework, mais plutôt une classe perso (myPDO) pour la génération de mes requêtes.
Je cherche donc actuellement à intégrer nativement cette classe myPDO à mon/mes modèles. Seulement j'ai besoin que cette classe ne soit instancié qu'une seul fois sur toute mon appli et si possible, ne soit pas instanciée si je ne l'appelle pas, j'ai donc besoin d’accéder à mon serviceManager depuis mon modèle qui au final est une classe quelconque (si j'ai bien suivi le fonctionnement de Zf2).
Mes questions sont donc :
- Comment déclarer ma classe myPDO au service manager ? (dans les factories, les invocables ? je suis un peu perdu)
- Comment utiliser cette classe depuis une classe quelconque (dans ce cas un modèle) ?
Ps: je suis nouveau sur Zf, veuillez donc pardonner mon éventuel manque de compréhension du framework !
Dernière modification par el3ctr0n (18-02-2013 09:33:53)
Hors ligne
Salut, pour ta première question voici la réponse :
http://framework.zend.com/manual/2.0/en … start.html
Pour la seconde j'y est déjà répondu sur le forum (le sujet n'est pas la même mais le principe reste identique) :
http://www.z-f.fr/forum/viewtopic.php?id=8477
Hors ligne
Merci Orkin pour cette réponse mais le concept du ServiceManager est encore flou pour moi !
Si je comprend, pour pouvoir récupéré une instance d'un objet (myPDO) depuis un endroit ou j'ai accès au serviceManager je doit dans ma config déclarer :
'factories' => array( 'My\Mvc\MyPDO' => function(){ $mypdo = New My\Mvc\MyPDO(); return $mypdo; } ),
et donc appeller dans mon controller (qui lui dispose du serviceManager) :
$this->getServiceLocator()->get('My\Mvc\MyPDO'); $this->getServiceLocator()->get('My\Mvc\MyPDO');
j'ai essayer, ça fonctionne (je n'ai qu'un apel du _construct()), par contre j'ai pas vraiment saisie la nuance en ServiceLocator et ServiceManager.
En ce qui concerne le deuxième point (pouvoir accéder au serviceManager depuis n'importe qu'elle classe), j'ai pas vraiment compris, j'ai essayer d'implémenter le ServiceManagerAwareInterface sur ma classe
namespace My\Mvc; use Zend\ServiceManager\ServiceManagerAwareInterface; use Zend\ServiceManager\ServiceManager; class Model implements ServiceManagerAwareInterface { protected $serviceManager; public function getServiceManager(){ return $this->serviceManager ; } public function setServiceManager(ServiceManager $serviceManager) { $this->serviceManager = $serviceManager; return $this; } }
Mais je n'arrive pas comprendre comment on lui transmet le service manager, j'ai essayer de modifier la config mais je n'obtient rien dans mon model après un New My\Mvc\Model() dans mon controller
'invokables' => array( 'My\Mvc\Model' => 'My\Mvc\Model', ),
Dernière modification par el3ctr0n (18-02-2013 11:27:13)
Hors ligne
el3ctr0n a écrit:
Si je comprend, pour pouvoir récupéré une instance d'un objet (myPDO) depuis un endroit ou j'ai accès au serviceManager je doit dans ma config déclarer :
Code:
'factories' => array( 'My\Mvc\MyPDO' => function(){ $mypdo = New My\Mvc\MyPDO(); return $mypdo; } ),
Non relis bien là tu dois lui passer une factorie alors que tu instancies ta classe sans passer par une factorie. Tu dois le mettre dans invokable avec le FQCN, le service manager s'occupera de faire le new.
el3ctr0n a écrit:
et donc appeller dans mon controller (qui lui dispose du serviceManager) :
Code:
$this->getServiceLocator()->get('My\Mvc\MyPDO');j'ai essayer, ça fonctionne (je n'ai qu'un apel du _construct()), par contre j'ai pas vraiment saisie la nuance en ServiceLocator et ServiceManager.
ServiceManager et ServiceLocator c'est la même chose au final je ne me souviens plus des nuances mais ça fonctionne pareil.
el3ctr0n a écrit:
Code:
namespace My\Mvc; use Zend\ServiceManager\ServiceManagerAwareInterface; use Zend\ServiceManager\ServiceManager; class Model implements ServiceManagerAwareInterface { protected $serviceManager; public function getServiceManager(){ return $this->serviceManager ; } public function setServiceManager(ServiceManager $serviceManager) { $this->serviceManager = $serviceManager; return $this; } }Code:
'invokables' => array( 'My\Mvc\Model' => 'My\Mvc\Model', ),
C'est comme ça qu'il faut faire donc ça c'est bon
el3ctr0n a écrit:
Mais je n'arrive pas comprendre comment on lui transmet le service manager, j'ai essayer de modifier la config mais je n'obtient rien dans mon model après un New My\Mvc\Model() dans mon controller
Parce que c'est le service manager qui s'occupe de ça. Il va voir que tu implémentes l'interface et lui passer le service manager. Le seul soucis c'est que pour que le service manager le fasse tu dois appeler ta classe depuis le service manager et non via un new.
Donc faire
[lang=php]$this->getServiceLocator()->get('My\Mvc\Model')
Hors ligne
Ah ok ! Le seul soucis c'est qu'en réalité dans mon controlleur j'instancie un modèle du même nom que mon controlleur qui hérite de My\Mvc\Model:
public function __get($name) if($name=='model') { if(isset($this->_model)) return $this->_model; else { $controllerName = $this->getEvent()->getRouteMatch()->getParam('controller'); $model = MODULE_NAME.'\Model\\'.ucfirst($controllerName).'Model'; $this->_model = New $model(); return $this->_model; } } }
Je vais donc devoir devoir déclarer tout mes modèles dans le invokables ? pas très pratique !
Hors ligne
ah bah si pas le choix sinon
Hors ligne
@el3ctr0n: En faite dans ce que tu cherche à faire tu fait une surcharge du model par default ou est ce que tu switch d'entrée le model afin de pas construire la base de model par defaut?
Hors ligne
Pages: 1