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; }
3 Réponses :
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'); //... } }
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 a>
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.
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');
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> getVicElocator () code> fait une erreur. Il a donc besoin de manière alternative.
Et étend
abstracttablegatewaywayway code> ou
serviceLocatorawareInterface code> avoir des erreurs.
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',
),
),