12
votes

Localisateur de services à Zend Framework 2

dans le contrôleur I Créez et utilisez mon modèle SO

public function getAlbumTable()
{
    if (!$this->albumTable) {
        $sm = $this->getServiceLocator();
        $this->albumTable = $sm->get('Album\Model\AlbumTable');
    }
    return $this->albumTable;
}


0 commentaires

3 Réponses :


15
votes

Zend MVC injectera l'instance ServiceLocator dans une classe implémentant Zend \ Servicanager \ ServicelocorawareInterface. Une simple implémentation pour une table modèle ressemble aux éléments suivants:

<?php
use Zend\Db\TableGateway\AbstractTableGateway;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserTable extends AbstractTableGateway implements ServiceLocatorAwareInterface {
  protected $serviceLocator;

  public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
    $this->serviceLocator = $serviceLocator;
  }

  public function getServiceLocator() {
    return $this->serviceLocator;
  }

  // now instance of Service Locator is ready to use
  public function someMethod() {
    $table = $this->serviceLocator->get('Album\Model\AlbumTable');
    //...
  }
}


3 commentaires

Eh bien, merci, ça marche vraiment! Et comment être avec des classes autres que la classe s'étend abstracttablegateway, par exemple, avec les classes des formulaires (étend la forme Zend \), les classes des éléments (étend le zend \ forment \ élément)? Comment utiliser le serviceLocator là-bas? Ou utilisez-le il y a une mauvaise idée? ..


Si la classe est créée via le servicanager qui implémente l'interface consciente, le servicanager est injecté une fois la classe créée. Pour Zend \ Formulaire, cela peut poser un problème autant que la configuration des éléments est généralement effectuée dans le constructeur (SM injecté après ce point). Il y a un blog post parle de cette question - MichaelgalleGo.fr/blog/?p=205


J'ai compris le gist de votre méthode. Il n'est pas clairement évident que faire appel à ServiceManager appelle automatiquement la méthode Setservicemanager lorsque vous créez une instance du formulaire étend la classe de formulaire que vous décrivez dans votre blog. Vous écrivez la nécessité d'utiliser le tableau 'invokables' pour le servicanager, pourriez-vous dire en détail comment faire cela. Merci.



6
votes

décidé. Alors. Pour résoudre la tâche des classes de modèles, doit mettre en œuvre l'interface ServiceLocatorawareInterface. Donc, l'injection ServiceManager se produira automatiquement dans votre modèle. Voir l'exemple précédent.

Pour les formulaires et autres objets de votre application Méthode appropriée proposé ici http: // michaelgallego.fr/blog/?p=205 Vous pouvez créer un formulaire de classe de base étend une base de base et implémente ServicemanagerawareInterface, à partir de laquelle vous hériterez de ses formulaires dans l'application. P>

$form = $this->getServiceLocator()->get('Album\Form\AlbumForm');


0 commentaires

0
votes

getVicElocator () code> fait une erreur. Il a donc besoin de manière alternative. Et étend abstracttablegatewaywayway code> ou serviceLocatorawareInterface code> avoir des erreurs.

La mise en œuvre d'usine aidera le contrôleur à obtenir des objets. P>

* Le code de l'utilisateur sera similaire à celui de l'album . p>

1) classe d'usine (registreControllerFactory.php) * Fonction copiée CreateUtilisateur dans le contrôleur P>

return array(   
    'controllers' => array(
    'invokables' => array(
        'Users\Controller\Index' => 'Users\Controller\IndexController', 
        'Users\Controller\login' => 'Users\Controller\LoginController', 
        //delete 'Users\Controller\Register'
    ),
    'factories' => array(
            'Users\Controller\Register' =>     'Users\Controller\Factory\RegisterControllerFactory',
   ),       
),


0 commentaires