Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
j'essaye de séparer mon formulaire avec des fieldset et donc j'essaye d'injecter l'entitymanager de Doctrine dans mes fieldset, je procède donc comme ceci :
[lang=php] // module.php public function getFormElementConfig() { return array( 'factories' => array( 'NewsFieldset' => function ($sm) { $em = $sm->get('Doctrine\ORM\EntityManager'); var_dump($em);exit; $fieldset = new Application\Form\NewsFieldset($em); //$fieldset->setServiceLocator($sm); //return $fieldset; } ) ); }
Ici la ligne $em = $sm->get('Doctrine\ORM\EntityManager'); me retourne l'erreur suivante :
[lang=php] Fatal error: Call to protected Doctrine\ORM\EntityManager::__construct() from context 'Zend\ServiceManager\AbstractPluginManager' in vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php on line 170
Vous avez une idée ?
Merci d'avance
Dernière modification par alien7 (02-04-2013 14:58:05)
Hors ligne
Salut Alien7, j'ai eu le problème très récemment . Tu peux par exemple faire comme tu le fais actuellement pour les formulaires puisque j'imagine que tu l'as déjà fait donc tu dois pouvoir reproduire assez facilement.
Sinon une autre solution serait de recupérer le service locator de ton plugin de service. En fait la méthode getFormElementConfig ne te retourne pas le serviceLocator mais le formElementManager dans ta variable $sm. Tu peux donc faire $sm->getServiceLocator()->get('Doctrine\ORM\EntityManager'); Ca ça devrait fonctionner (à tester car j'en suis pas certain).
Sinon la solution la plus propre est la suivante : ton fieldset doit donc implémenter l'interface ObjectManagerAwareInterface de cette façon le service manager pourra lui passer l'object manager (c'est à dire l'entity manager puisque l'entity manager hérite d'object manager) lorsque tu lui demanderas de te renvoyer une instance.
Jusque là tout va bien mais tu t’apercevra que l'entity manager est null dans ton fieldset car le formElementManager nécessite un initialiser afin d'appeler le setter qui va bien. C'est pas fait par défaut car c'est des actions qui sont effectuées à chaque création d'objet donc tu imagines bien qu'une telle vérification sur X initialisers qui ne servent pas provoquerait des problèmes de performance puisque tu aurais X vérifications pour chaque création d'objets.
Tu dois donc faire ceci :
[lang=php]public function getFormElementConfig() { return array( 'initializers' => array( 'ObjectManagerInitializer' => function ($element, $formElements) { if ($element instanceof ObjectManagerAwareInterface) { $services = $formElements->getServiceLocator(); $entityManager = $services->get('Doctrine\ORM\EntityManager'); $element->setObjectManager($entityManager); } }, ), ); }
Du coup chaque objet qui implémentera l'interface ObjectManagerAwareInterface aura accès au service manager. Tu noteras que la deuxième solution que je te propose est utilisée puisqu'on ne récupère pas l'entity manager depuis le formElementManager mais depuis le serviceLocator.
De plus tu dois déporter l'ajout d'élements dans une fonction init() qui est appelé par la factory des formulaires car dans le constructeur tu n'as pas encore accès à l'entity manager.
Hors ligne
Ca marche impec
Merci Orkin tu as sauvé ma journée
Merci
Hors ligne
Pages: 1