ZF2 quand utiliser getServiceLocator() et quand ne pas le faire
Je suis vraiment confus quand utiliser getServiceLocator et quand ne pas.
À titre d'exemple:
+ Module
-+ Helloworld
--+ src
---+ Controller
----+ IndexController.php
----+ IndexControllerFactory.php
---+ Service
----+ LogginService.php
----+ GreetingService.php
----+ GreetingServiceFactory.php
GreetingServiceFactory.php le contenu:
<?php
namespace Helloworld\Service;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class GreetingServiceFactory implements FactoryInterface
{
public function createService (ServiceLocatorInterface $serviceLocator)
{
$greetingService = new GreetingService();
$greetingService->setEventManager($serviceLocator->get('eventManager'));
$loggingService = $serviceLocator->get('loggingService');
$greetingService->getEventManager()->attach('getGreeting', array(
$loggingService,
'onGetGreeting'
));
return $greetingService;
}
}
Et IndexControllerFactory.php le contenu:
<?php
namespace Helloworld\Controller;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class IndexControllerFactory implements FactoryInterface
{
public function createService (ServiceLocatorInterface $serviceLocator)
{
$ctr = new IndexController();
$ctr->setGreetingService($serviceLocator->getServiceLocator()
->get('greetingService'));
return $ctr;
}
}
Comme vous pouvez le voir, j'ai besoin de $serviceLocator->getServiceLocator() dans mon ControllerFactory mais pas dans mon ServiceFactory. Pourquoi? Les deux utilisent la même interface ServiceLocatorInterface qui n'a même pas définir le getServiceLocator() la méthode.
module.config.php:
'controllers' => array(
'factories' => array(
'Helloworld\Controller\Index' => 'Helloworld\Controller\IndexControllerFactory'
)
)
,
'service_manager' => array(
'invokables' => array(
'loggingService' => 'Helloworld\Service\LoggingService'
),
'factories' => array(
'greetingService'=> 'Helloworld\Service\GreetingServiceFactory'
),
)
J'apprécierais tout éclaircissement 🙂
Have a nice day!
OriginalL'auteur machete | 2013-02-16
Vous devez vous connecter pour publier un commentaire.
La méthode
getServiceLocator
est défini sur laAbstractPluginManager
, car il met en œuvre laServiceLocatorAwareInterface
. Comme Maks3w l'a souligné, il ne fait pas partie de laServiceLocatorInterface
, donc éviter de l'utiliser lors de la mise en œuvre d'un service de l'usine.Vous pouvez de toute façon à définir votre usine de fermeture et de toujours l'utiliser:
Alors que dans cet exemple
$pm
est en effet unServiceLocatorInterface
exemple, vous aurez toujours besoin pour obtenir une référence à la "main" du gestionnaire de service pour accéder à la'greetingService'
.ZF2 utilise différents chefs de service ou plugin gestionnaires pour les contrôleurs, les services, les aides de vue, contrôleur de plugins, etc... C'est surtout pour le type-hinting (regardez l'interface de la
AbstractPluginManager
de comprendre comment le type rigueur est atteint), et pour la sécurité.Dans ce cas, le problème de sécurité refuse l'accès à des services qui ne sont pas des contrôleurs, en particulier avec les routes avec une dynamique
controller
paramètre. C'est pourquoi les contrôleurs sont conservés dans un autre gestionnaire de plugin.Depuis le contrôleur de gestionnaire de plugin est créé à partir de la "main" du gestionnaire de service, il est également initialisée grâce à la
ServiceLocatorAwareInterface
.Pour rendre ceci plus clair, j'ai ajouté un graphique des relations (n'inclut pas l'usine et ne le prenez pas comme valide UML):
c'est YUML
OriginalL'auteur Ocramius
Le contrôleur de l'usine est appelé par un autre gestionnaire de service de l'instance (le "ControllerLoader") à la principale. C'est ainsi que le répartiteur peut pas donner lieu à un arbitraire de la classe instanciée par le principal gestionnaire de service.
En conséquence, le contrôleur de l'usine de $serviceLocator n'est pas celui dont vous avez besoin lorsque vous souhaitez récupérer 'greetingService", "greetingService' est inscrit avec le service principal gestionnaire. Pour obtenir le principal le gestionnaire de serveur à partir du contrôleur, vous utilisez getServiceLocator() et vous avez maintenant une instance de la principal du gestionnaire de service à partir de laquelle vous pouvez obtenir() 'salut' service de
Ceci est connu comme 'peering'. c'est à dire le "ControllerLoader" service manager (configuré par les contrôleurs de la clé dans la config ou getControllerConfiguration() dans un Module de classe) est mis en place avec le service principal gestionnaire de pair.
OriginalL'auteur Rob Allen
Dénitivement vous shouln'pas utiliser
getServiceLocator
depuis que la méthode n'est pas définie dansServiceLocatorInterface
au lieu d'utiliserget()
OriginalL'auteur Maks3w
Je vous propose ceci comme une alternative qui utilise la base module.config.php le programme d'installation
Maintenant je faisais quelque chose de similaire, mais en utilisant quelque chose comme cela.
Maintenant, la chose qui avait perplexe, m'a été d'avoir à venir à la réalisation que j'avais besoin d'utiliser uniquement le premier localisateur de service est utilisé lors de l'instanciation d'un contrôleur qui s'étend cette classe...
Sur l'instanciation: cette classe a été le premier à m'nourris avec un ControllerManager et puis le ServiceManager pour la setServiceLocator méthode.
Je ne voulais utiliser le ControllerManger et sa méthode pour obtenir le ServiceManager pour ensuite instancier mon usines;
partielle sur mon module.config.php
Maintenant je pourrais avoir utilisé quelque chose comme ce qui suit dans le filtre pour le droit ServiceLocator... pourtant je suis un fan de l'utilisation que peu de chaudière plaque que nécessaire...
OriginalL'auteur jumpinJack