Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-04-2012 09:15:43

ondex
Nouveau membre
Date d'inscription: 26-08-2008
Messages: 5

D-I et équivalent Singleton

Salut à tous,

je commence à jouer un peu avec ZF-2 et j'ai un soucis de compréhension sur le D-I. SI je comprend bien, une bonne utilisation du D-I permet d'éviter l'utilisation des Singletons.

Voici donc ce que j'ai fait :

Code:

[lang=php]namespace MyProject\Model;

class Identity
{
    protected $login;
    protected $password;
    
    public function getLogin() { ... }
    public function setLogin($login) { ... }
    public function getPassword() { ... }
    public function setPassword($password) { ... }
}

Dans la configuration de mon module, j'ai ça :

Code:

[lang=php]return array(
    'di' => array(
        'instance' => array(
            'InformationsStore' => array(
                'parameters' => array(
                    'identity' => 'MyProject\Model\Identity',
                ),
            ),

            'MyProject\Listener\AuthenticationListener' => array(
                'parameters' => array(
                    'identity' => 'MyProject\Model\Identity',
                ),
            ),
            
            'MyProject\Model\Identity' => array(),
        ),
    ),
);

Et je constate que l'instance de Identity n'est pas la même dans AuthenticationListener et dans InformationsStore.

Comment faire en sorte d'avoir une instance partagée ?

Hors ligne

 

#2 24-04-2012 14:43:10

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: D-I et équivalent Singleton

Si tu injectes des valeurs dans ton modèle ce sont bien les mêmes valeurs que tu retrouves dans AuthenticationListener et InformationsStore, n'est-ce pas ?

Code:

'MyProject\Model\Identity' => array(
    'parameters' => array(
        'login' => 'test',
        'password' => 'azerty'
        )
    )
)

Je viens de regarder le code dans Zend\Di, il est bien écrit que la même instance est censée être renvoyée. Quel test fais-tu pour te rendre compte que ce n'est pas la même instance ?

Hors ligne

 

#3 24-04-2012 15:38:27

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

Re: D-I et équivalent Singleton

Plop, j'avais remarqué un truc similaire, je me souviens plus exactement dans quelles circonstances mais c'est il me semble à l'instanciation de l'Entity Manager lorsque l'on force l'utf8 j'avais plusieurs fois la requête d'exécutée. J'en ai donc déduit qu'il instanciait à chaque fois un nouvel objet.

Lorsque j'ai retiré cette injection et fait une méthode qui gère ce que je voulais faire je n'ai eu plus qu'une seule requête SQL par requête HTTP.

Hors ligne

 

#4 24-04-2012 18:56:11

ondex
Nouveau membre
Date d'inscription: 26-08-2008
Messages: 5

Re: D-I et équivalent Singleton

Le test est assez simple.

AuthenticationListener est appelé avant InformationsStore.

AuthenticationListener a pour rôle de récupérer un login et un mot de passe à partir d'un cookie. Il place ensuite ces valeurs dans l'objet Identity (via les méthodes setLogin() et setPassword()).

Si, à la fin de AuthenticationListener je fais un var_dump() de l'objet Identity, j'ai bien le login et le mot de passe.

Ensuite, si dans InformationsStore je fais un var_dump() de l'objet Identity, les valeurs de login et password sont NULL.

Par ailleurs, l'ID de l'objet montre bien que c'est une autre instance :

Code:

object(MyProject\Model\Identity)#164 (2) {
  ["login":protected]=>
  string(26) "mylogin"
  ["password":protected]=>
  string(8) "mypassword"
}
object(MyProject\Model\Identity)#189 (2) {
  ["login":protected]=>
  NULL
  ["password":protected]=>
  NULL
}

Hors ligne

 

#5 24-04-2012 20:54:18

ondex
Nouveau membre
Date d'inscription: 26-08-2008
Messages: 5

Re: D-I et équivalent Singleton

Bon, j'ai avancé, j'ai trouvé où est le problème, mais j'avoue que la logique m'échappe. C'est quand même un peu obscure tout ça.

En gros, AuthenticationListener est, comme son nom l'indique, un listener :

Code:

[lang=php]class AuthenticationListener implements ListenerAggregate
{
    public function __construct(\SOGoAccountManager\Model\Identity $identity, Config $config) { ... }
}

Je le déclare via le fichier Module.php :

Code:

[lang=php]class Module implements AutoloaderProvider
{
    public function init()
    {
        $events = StaticEventManager::getInstance();
        $events->attach('bootstrap', 'bootstrap', array($this, 'registerStaticListeners'));
    }
 
    public function getAutoloaderConfig() { ... }

    public function getConfig() { ... }

    public function registerStaticListeners(Event $e)
    {
        $app      = $e->getParam('application');
        $config   = $e->getParam('config');
        $locator  = $app->getLocator();
        $events   = StaticEventManager::getInstance();

        $listener = $locator->get('SOGoAccountManager\Listener\AuthenticationListener', array('config' => $config));
        $events->attach('Zend\Stdlib\Dispatchable', 'dispatch', array($listener, 'checkSOGoAuthentication'), 100);
    }
}

J'ai constaté dans Zend/Di/Di.php, ligne 202 à 206 (pour la beta 3), que un coup $params était vide, et un coup non :

Code:

[lang=php]            if ($params) {
                $this->instanceManager->addSharedInstanceWithParameters($instance, $name, $params);
            } else {
                $this->instanceManager->addSharedInstance($instance, $name);
            }

En analysant le contenu de $params, j'ai vu que c'était un tableau qui contenait la configuration.

Donc, si je supprime le passage de la configuration à AuthenticationListener dans Module.php, j'ai bien deux fois $params qui est vide, du coup il appelle deux fois addSharedInstance(), et donc j'ai le même objet.

Bon, je ne sais pas trop quoi en penser... Bug, feature ?

Hors ligne

 

#6 27-04-2012 00:03:51

bakura
Administrateur
Date d'inscription: 30-01-2010
Messages: 353

Re: D-I et équivalent Singleton

A mon avis c'est une fonctionnalité, puisqu'il y a une distinction claire dans le code (le if else). Je viens de regarder le code de la fonction addShardInstanceWithParameters (https://github.com/zendframework/zf2/bl … anager.php) et il créé une clé de hash par rapport aux paramètres et aux valeurs.

Donc il te créera même des instances différentes si tu lui passes des paramètres différents.

C'est vérifié dans les tests unitaires, ce qui prouve que c'est bien le comportement attendu (https://github.com/zendframework/zf2/bl … erTest.php).

Après tout, c'est plutôt logique en fait : si tu souhaites récupérer une instance avec des valeurs chaque fois différentes, c'est bien que tu souhaites des instances différentes.

Hors ligne

 

#7 27-04-2012 08:50:19

ondex
Nouveau membre
Date d'inscription: 26-08-2008
Messages: 5

Re: D-I et équivalent Singleton

Je ne suis pas vraiment d'accord.

Dans la config, la classe Identity ne prend aucuns paramètres.  C'est AuthenticationListener qui reçoit les paramètres. Et apparemment, ils sont "transférés" à Identity.

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