2017-07-25 4 views
-2

Ich habe einen abstrakten Controller in meiner app (ZF3), die alle mein Controller-Modul erweitert.ZF3 Was mit getServiceLocator zu tun() -> get ('Übersetzer') in AbstractContoller

Ich rufe hier meinen Basis-Übersetzer an und verwende den Übersetzer auch pro Modul, aber da getServiceLocator() aus ZF3 entfernt wird, frage ich mich, was ich tun kann, um einen $ this-> Übersetzer in diesem erweiterten Controller zu erstellen.

Das, was ich in ZF2 verwendet:

$this->translator = $this->getServiceLocator()->get('translator'); 

Ich habe diese Dokumente gefunden, aber dies scheint mir einen anderen Zweck.

https://zendframework.github.io/zend-mvc/migration/to-v2-7/#servicelocatoraware-initializers

+0

Eigentlich Ihr Link gibt genau das, was Sie zu tun haben. Lesen Sie einfach nach "Um Ihren Code vorzubereiten ...". Wenn ich Zeit finde, werde ich versuchen, mit speziellem Code auf Ihren Fall zu antworten. Hinweis: Möglicherweise müssen Sie den Übersetzer für jeden Controller in seiner eigenen Fabrik injizieren. –

+0

Vielen Dank, dass Sie mir mit (einem funktionierenden) Beispiel geholfen haben! Ich finde es wirklich heraus und werde wieder über das, was du gesagt hast, lesen und alles debuggen und neu debuggen! – Matt

+0

Ich kämpfe immer noch hier, da die Beispiele über Container und die Beispiele talk (die für mich nicht ganz brauchbar sind) einfach eine Ordnername drin haben usw. Auch wenn man eine Fabrik benutzt, kann dies auf mehrere Arten geschehen? – Matt

Antwort

0

Es gibt verschiedene Möglichkeiten, dieses Problem zu überwinden.

Erste-Lösung, die in den Sinn kommt, was sonst eher eine schnelle Lösung als alles, was ist, ist der Service Locator in jedem Controller zu injizieren. Um dies zu tun, müssen Sie es über den Konstruktor injizieren und ändern Sie Ihre Fabrik für Controller (Fabriken, wenn viele von ihnen).

Wie Sie das tun, kann yoou nur die Übersetzer injiziert, anstatt der Behälter (Service Manager).

Initialisierer sind in der Tat ein Weg zu gehen, aber sie könnten später entfernt werden. Ich würde wahrscheinlich eher eine delegator verwenden. Auf diese Weise müssen Sie sich nicht durch den Konstruktor injizieren, aber Sie werden durch eine Setter injizieren müssen, das heißt, Sie zeitliche Kopplung einführen ...

+0

Danke! Der beste Weg scheint es in jedem Controller zu injizieren, also nur dort, wo Sie es brauchen. Ich suche nach (Arbeits) Beispielen, da ich neu bin und in der Tat eine schnelle Lösung brauche, um weiterzumachen. Ich fand eine andere Lösung, die nicht so gut verwendet werden kann, wie controller_plugins in ZF4 entfernt werden, aber sein Tutorial ist perfekt! https://daredevel.com/2017/04/to-setup-translate-controller-plugin-zend-framework-3/ – Matt

+0

Sie mit der Art und Weise im Tutorial vorgeschlagen gehen können, ist es auf jeden Fall gültig für ZF3. In ZF4 werden wir wahrscheinlich nur PSR7/PSR15-Aktionen haben, also definitiv kein Plugin. Wenn Sie diesen Weg gehen möchten, verwenden Sie Middleware-Routen und injizieren Sie Ihren Übersetzer, wo nötig. –

+0

Ich bin mir sicher, dass ich den Fabrikweg gehen muss, ich brauche immer noch ein gutes Beispiel, um sicherzugehen, dass ich den richtigen Weg gehe, weil es scheint, dass die Leute es sogar auf verschiedene Arten machen, Fabriken zu benutzen. – Matt