Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-02-2013 09:31:57

el3ctr0n
Nouveau membre
Date d'inscription: 15-02-2013
Messages: 4

Accès au service manager depuis une classe quelconque

Bonjour,

Dans le cadre d'un futur projet sur le framework Zf2, je cherche à mettre en place des petits outils qui me simplifieront le développement, et je travail actuellement sur la création d'une classe modèle mère (qui sera dédié au contrôleur dans lequel je travail).
Par défaut , je ne compte pas utiliser d'ORM ou les classes dédiées du framework, mais plutôt une classe perso (myPDO) pour la génération de mes requêtes.
Je cherche donc actuellement à intégrer nativement cette classe myPDO à mon/mes modèles. Seulement j'ai besoin que cette classe ne soit instancié qu'une seul fois sur toute mon appli et si possible, ne soit pas instanciée si je ne l'appelle pas, j'ai donc besoin d’accéder à mon serviceManager depuis mon modèle qui au final est une classe quelconque (si j'ai bien suivi le fonctionnement de Zf2).

Mes questions sont donc :
- Comment déclarer ma classe myPDO au service manager ? (dans les factories, les invocables ? je suis un peu perdu)
- Comment utiliser cette classe depuis une classe quelconque (dans ce cas un modèle) ?

Ps: je suis nouveau sur Zf, veuillez donc pardonner mon éventuel manque de compréhension du framework !

Dernière modification par el3ctr0n (18-02-2013 09:33:53)

Hors ligne

 

#2 18-02-2013 09:46:30

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

Re: Accès au service manager depuis une classe quelconque

Salut, pour ta première question voici la réponse :
http://framework.zend.com/manual/2.0/en … start.html

Pour la seconde j'y est déjà répondu sur le forum (le sujet n'est pas la même mais le principe reste identique) :
http://www.z-f.fr/forum/viewtopic.php?id=8477

Hors ligne

 

#3 18-02-2013 11:23:19

el3ctr0n
Nouveau membre
Date d'inscription: 15-02-2013
Messages: 4

Re: Accès au service manager depuis une classe quelconque

Merci Orkin pour cette réponse mais le concept du ServiceManager est encore flou pour moi !

Si je comprend, pour pouvoir récupéré une instance d'un objet (myPDO) depuis un endroit ou j'ai accès au serviceManager je doit dans ma config déclarer :

Code:

'factories' => array(
        'My\Mvc\MyPDO' => function(){
        $mypdo = New My\Mvc\MyPDO();
        return $mypdo;
    }
),

et donc appeller dans mon controller (qui lui dispose du serviceManager) :

Code:

$this->getServiceLocator()->get('My\Mvc\MyPDO');
$this->getServiceLocator()->get('My\Mvc\MyPDO');

j'ai essayer, ça fonctionne (je n'ai qu'un apel du _construct()), par contre j'ai pas vraiment saisie la nuance en ServiceLocator et ServiceManager.

En ce qui concerne le deuxième point (pouvoir accéder au serviceManager depuis n'importe qu'elle classe), j'ai pas vraiment compris, j'ai essayer d'implémenter le ServiceManagerAwareInterface sur ma classe

Code:

namespace My\Mvc;

use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;

class Model implements ServiceManagerAwareInterface
{
     protected $serviceManager;

    public function getServiceManager(){
        return $this->serviceManager ;
    }

    public function setServiceManager(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;
        return $this;
    }
    
}

Mais je n'arrive pas comprendre comment on lui transmet le service manager, j'ai essayer de modifier la config mais je n'obtient rien dans mon model après un New My\Mvc\Model() dans mon controller

Code:

'invokables' => array(
    'My\Mvc\Model' => 'My\Mvc\Model',
),

Dernière modification par el3ctr0n (18-02-2013 11:27:13)

Hors ligne

 

#4 18-02-2013 11:44:37

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

Re: Accès au service manager depuis une classe quelconque

el3ctr0n a écrit:

Si je comprend, pour pouvoir récupéré une instance d'un objet (myPDO) depuis un endroit ou j'ai accès au serviceManager je doit dans ma config déclarer :

Code:

'factories' => array(
        'My\Mvc\MyPDO' => function(){
        $mypdo = New My\Mvc\MyPDO();
        return $mypdo;
    }
),

Non relis bien là tu dois lui passer une factorie alors que tu instancies ta classe sans passer par une factorie. Tu dois le mettre dans invokable avec le FQCN, le service manager s'occupera de faire le new.

el3ctr0n a écrit:

et donc appeller dans mon controller (qui lui dispose du serviceManager) :

Code:

$this->getServiceLocator()->get('My\Mvc\MyPDO');

j'ai essayer, ça fonctionne (je n'ai qu'un apel du _construct()), par contre j'ai pas vraiment saisie la nuance en ServiceLocator et ServiceManager.

ServiceManager et ServiceLocator c'est la même chose au final je ne me souviens plus des nuances mais ça fonctionne pareil.

el3ctr0n a écrit:

Code:

namespace My\Mvc;

use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;

class Model implements ServiceManagerAwareInterface
{
     protected $serviceManager;

    public function getServiceManager(){
        return $this->serviceManager ;
    }

    public function setServiceManager(ServiceManager $serviceManager)
    {
        $this->serviceManager = $serviceManager;
        return $this;
    }
    
}

Code:

'invokables' => array(
    'My\Mvc\Model' => 'My\Mvc\Model',
),

C'est comme ça qu'il faut faire donc ça c'est bon

el3ctr0n a écrit:

Mais je n'arrive pas comprendre comment on lui transmet le service manager, j'ai essayer de modifier la config mais je n'obtient rien dans mon model après un New My\Mvc\Model() dans mon controller

Parce que c'est le service manager qui s'occupe de ça. Il va voir que tu implémentes l'interface et lui passer le service manager. Le seul soucis c'est que pour que le service manager le fasse tu dois appeler ta classe depuis le service manager et non via un new.
Donc faire

Code:

[lang=php]$this->getServiceLocator()->get('My\Mvc\Model')

Hors ligne

 

#5 18-02-2013 11:59:38

el3ctr0n
Nouveau membre
Date d'inscription: 15-02-2013
Messages: 4

Re: Accès au service manager depuis une classe quelconque

Ah ok !  Le seul soucis c'est qu'en réalité dans mon controlleur j'instancie un modèle du même nom que mon controlleur qui hérite de My\Mvc\Model:

Code:

public function __get($name)
    if($name=='model')
    {
        if(isset($this->_model)) return $this->_model;
        else
        {
            $controllerName = $this->getEvent()->getRouteMatch()->getParam('controller');
            $model = MODULE_NAME.'\Model\\'.ucfirst($controllerName).'Model';
            $this->_model = New $model();
            return $this->_model;
        }
    }
}

Je vais donc devoir devoir déclarer tout mes modèles dans le invokables ? pas très pratique !

Hors ligne

 

#6 18-02-2013 14:26:42

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

Re: Accès au service manager depuis une classe quelconque

ah bah si pas le choix sinon smile

Hors ligne

 

#7 21-08-2017 17:01:34

BeRoots
Membre
Date d'inscription: 15-05-2008
Messages: 79

Re: Accès au service manager depuis une classe quelconque

@el3ctr0n: En faite dans ce que tu cherche à faire tu fait une surcharge du model par default ou est ce que tu switch d'entrée le model afin de pas construire la base de model par defaut?


wink Non au language SMS sur nos forums wink

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