IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

[ZF2.x] Comment récupérer le service manager


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut [ZF2.x] Comment récupérer le service manager
    Bonjour,

    Pour récupérer un service depuis un module je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $service = $evm->getApplication()->getServiceManager()->get("MonServiceId");
    le service manager est $evm.

    Depuis un controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $service = $this->getServiceLocator()->get("MonServiceId");
    Je récupère le service manager via la commande : $this->getServiceLocator().

    Je développement actuellement une classe que je ne souhaite pas intégrer dans la conf de zend, mais je voudrais récupérer un service (notamment le service de traduction 'translate'). Comment puis-je récupérer le service manager dans ma classe ?

    merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonsoir,

    que je ne souhaite pas intégrer dans la conf de zend
    C'est à dire ? Pas sûr de comprendre ce que tu veux exactement.

    Sinon, si je ne me trompe pas dans le code que j'ai survolé (pas d'environnement de test pour tester cette belle théorie), il suffirait que ta classe implémente
    Zend\ServiceManager\ServiceManagerAwareInterface. A partir de ça si tu instancies ta classe via la ServiceManager, il devrait s'injecter dans ta classe automatiquement, en tout cas c'est ce qu'indique la doc de la classe Zend\ServiceManager\ServiceManagerConfig :

    In addition to using each of the internal properties to configure the service manager, also adds an initializer to inject ServiceManagerAware and ServiceLocatorAware classes with the service manager.

  3. #3
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Justement, je ne veux pas passer par zend pour instancier ma classe.

    Je voudrais juste récupérer l'instance du service manager pour récupérer le service de traduction et la session dans ma class.

    Quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \Zend\ServiceManager\ServiceManager::getInstance()

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Bonjour,

    A mon sens, il vaudrait mieux utiliser le setter plutôt que de créer un ServiceManager en dur dans ta classe... l'utilisation que tu souhaites semble aller à contresens de la philosophie du ZF2, aussi tu risques tôt ou tard de te heurter à quelques soucis.

    Mais si tu veux le faire tout de même (ou que tu n'as pas trop le choix), il n'y a pas de méthode statique getInstance (qui est plus dans la philosophie ZF1), mais l'instanciation n'est pas très très compliquée a priori, extrait de \Zend\Mvc\Application::init() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : array();
    $serviceManager = new ServiceManager(new Service\ServiceManagerConfig($smConfig));
    $serviceManager->setService('ApplicationConfig', $configuration);
    Reste à espérer que ça suffise à configurer les objets dont tu as l'utilisation, et que tu ais à disposition le tableau de configuration de l'application là où tu souhaites instancier le service manager.

  5. #5
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Oui je vais rajouter un setter sur ma classe et donner le serviceLocator depuis mon controller. C'est assez 'propre'.

    Merci.

  6. #6
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Je ne suis pas sûr que cette solution soit viable dans lesens ou celà doit créer (je peux me tromper) une nouvelle instance de ServiceManager. Donc jene suis pas sûr qu'il ne recrée pas de nouvelles instance des service...Ca peut faire du dégât d'avoir 2 objets $session

  7. #7
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    A priori, en tout cas sur ZF1, les conséquences auraient été limitées (ZendSession travaillant directement sur la superglobale...), mais je suis d'accord, c'est du domaine de l'expérimental et donc risqué

    Oui je vais rajouter un setter sur ma classe et donner le serviceLocator depuis mon controller. C'est assez 'propre'.
    Si tu fais un setServiceManager, profite-en pour implémenter Zend\ServiceManager\ServiceManagerAwareInterface qui ne décrit que cette méthode, ça sera fait Tu peux aussi utiliser Zend\ServiceManager\ServiceLocatorAwareInterface à la place selon que tu préfères te baser sur le ServiceManager concret ou l'interface ServiceLocator.

    Par contre je rebondis là dessus, si tu es dans un contrôleur, que tu as accès au ServiceManager... Qu'est-ce qui t'empêche d'utiliser ton ServiceManager pour instancier ta classe ? Si ta classe est un singleton, ou instanciée par une fabrique, tu peux toujours refactoriser un peu pour que ce soit le ServiceManager qui l'instancie sans remettre en cause ton API (en modifiant ton singleton / ta fabrique pour utiliser le SM), et tu auras convertis ta classe pour fonctionner pleinement avec ZF2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/06/2011, 19h27
  2. Comment récupérer les windows message dans un service
    Par coxman68 dans le forum Débuter
    Réponses: 0
    Dernier message: 26/02/2009, 12h20
  3. Comment récupérer le code de sortie d'un service ?
    Par CleM_71 dans le forum Windows
    Réponses: 12
    Dernier message: 15/01/2009, 15h49
  4. Réponses: 1
    Dernier message: 27/04/2007, 11h41
  5. Réponses: 3
    Dernier message: 01/03/2007, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo