Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 02-04-2013 12:23:11

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

[Resolu] Injection de l'entity manager dans les fieldset

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 :

Code:

[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 :

Code:

[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)


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

Hors ligne

 

#2 02-04-2013 14:08:54

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Resolu] Injection de l'entity manager dans les fieldset

Salut Alien7, j'ai eu le problème très récemment smile. 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 :

Code:

[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

 

#3 02-04-2013 14:57:33

alien7
Membre
Date d'inscription: 29-04-2007
Messages: 447

Re: [Resolu] Injection de l'entity manager dans les fieldset

Ca marche impec

Merci Orkin tu as sauvé ma journée smile
Merci


ZF 2.3 - Twitter Bootstrap 3.2
Local: Ubuntu  -> Apache2 2.4 - MariaDB 10 - PHP 5.6

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