2017-04-12 2 views
0

Ich habe eine Serviceklasse MyService, die ich auf den Controllern verwende, indem ich sie als Parameter im Controller-Konstruktor übergebe. Unnötig zu sagen, verwende ich eine Fabrik, um die Controller zu instanziieren, und benutze den Service Locator der Fabrik, um MyService abzurufen und dann an den instanziierten Controller zu übergeben.ZF2 - Wie man einen Service in eine Ansicht injiziert?

// factory 
$sl = $sl->getServiceLocator(); 
$ms = $sl->get(MyService::class); 

return new MyController($sm); 

Jetzt brauche ich diesen Service in der Ansicht. Ich habe versucht, einen View Helfer schaffen, die MyService als Abhängigkeit dauern würde, (ähnlich dem Controller) wie folgt aus:

// view helper factory 
$ms = $sl->get(MyService::class); 

return new MyServiceViewHelper($ms); 

Allerdings wird es nicht richtig MyService instanziiert. Stürzt sagen:

Catchable fatal error: Argument 1 passed to MyService::__construct() must be an instance of MyRepository, none given, called in /my-path/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php 

MyService dauert ca. 3 Repositories als Abhängigkeiten, die natürlicherweise von der MyServiceFactory vorgesehen sind. Aus irgendeinem Grund ruft der Ansichtshelfer die Factory oder etwas ähnliches nicht richtig auf, was zu einer inkorrekten Instanziierung führt.

Also mein nächster Gedanke ist: vielleicht ist dies nicht, wie Sie Dienste in die Ansicht injizieren. So jetzt frage ich:

Wie injiziere ich Dienstleistungen zu den Ansichten selbst?

Edit: Bitte sagen Sie nicht "Pass es vom Controller".

Antwort

2

Die Viewhelper aus einem separaten Plugin abgerufen HelperPluginManager, das gleiche gilt für die Steuerungen gilt und die ControllerManager verwaltet werden. Um Dienste vom ServiceManager "root" abzurufen, müssen Sie in Ihrem Werk wie in der Fabrik der Steuerung getServiceLocator() aufrufen.

So sollte Ihr Code sein:

// view helper factory 
$sl = $sl->getServiceLocator(); //This line will do the trick 
$ms = $sl->get(MyService::class); 

return new MyServiceViewHelper($ms); 
Verwandte Themen