2014-09-17 2 views
0

Je suis familier avec l'utilisation de la Session dans ZF2, par ex.ZF2: Injection de la gestion de session dans un service

 $user_session = new Container('user'); 
     $user_session->username = 'JohnDoe'; 

Cela est bien, mais si je suis en train de maintenir les données de session dans l'un de mes services logiques d'affaires je voudrais fortement préfèrent injecter un objet de gestion de session/services dans le constructeur de mon service, comme dans ce pseudocode :

class BusinessSvc{ 
    protected $sessionSvc; 

    function __construct($sessionSvc){ 
     $this->sessionSvc = $sessionSvc; 
    } 

    public function doBusinessLayerStuff(){ 
     ... do stuff ... 
     $this->sessionSvc->store('lastOrderNumber', '1234'); 
     ... do stuff ... 
    } 
} 

Je pense que le framework fournirait cette fonctionnalité, mais je ne la trouve nulle part. Je pourrais toujours écrire le mien, mais je ne voulais pas réinventer la roue.

+1

Pas tout à fait sûr de ce que vous voulez dire; les conteneurs de session étant espacés de nom, * est * le service de session, il n'est pas nécessaire d'envelopper une autre classe autour d'eux - c'est-à-dire que vous pouvez ajouter, retirer du conteneur à volonté. Si vous deviez créer une fabrique pour chaque conteneur, vous pouvez ensuite les réutiliser en les injectant dans d'autres services (donc dans votre exemple '$ sessionSvc' serait une instance de' Zend \ Session \ Container'). Si vous souhaitez gérer la gestion de sessions globalement, consultez ['Zend \ Session \ SessionManager'] (https://github.com/zendframework/zf2/blob/master/library/Zend/Session/SessionManager.php) – AlexP

+1

Hmmm, peut-être avez-vous raison? Je peux juste instancier un conteneur dans mon Module.php et le passer au constructeur du service de cette façon. Il me manquait la forêt pour les arbres je pense. – AlexMA

Répondre

2

La réponse était beaucoup plus simple que je me suis rendu compte. Une fois instanciée, une instance de conteneur peut elle-même être injectée dans le service métier et lui donner accès à la session. Si vous utilisez phpunit pour tester le service ultérieurement, l'objet pourrait être mocké avec un tableau ou une instance de ArrayObject.

Dans la méthode getServiceConfig de module.php:

'MyModule\Service\BusinessService' => function($sm) { 
     // Container doesn't need to use this name but it seems sensible. 
     $container = new Container('MyModule\Service\BusinessService'); 
     return new Service\BusinessService($container); 
},