2017-07-25 1 views
-2

J'ai un contrôleur abstrait dans mon application (ZF3) qui étend tous mes contrôleurs de module.ZF3 Que faire avec getServiceLocator() -> get ('translator') dans AbstractContoller

J'appelle ici mon traducteur de base et j'applique le traducteur aussi par module mais comme getServiceLocator() est retiré de ZF3 je me demande ce que je peux faire pour créer un traducteur $ this-> dans ce contrôleur étendu.

Ce que je en ZF2:

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

J'ai trouvé ces documents, mais cela est semble dans un autre but pour moi.

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

+0

En fait, votre lien spécifie exactement ce que vous devez faire. Il suffit de lire après "Pour préparer votre code ...". Si je trouve le temps, je vais essayer de répondre avec un code spécifique à votre cas. Notez que vous devrez peut-être injecter le traducteur pour chaque contrôleur dans sa propre usine. –

+0

Merci beaucoup de m'avoir aidé avec un exemple de travail! Je suis vraiment en train de comprendre et relire ce que vous avez dit et déboguer et re-déboguer tout ça! – Matt

+0

Je me bats encore ici comme exemples de talsk sur les conteneurs et les exemples (qui ne sont pas complètement utilisables pour moi) il suffit de mettre un nom de fichier, etc. Même en utilisant une usine cela peut-il être fait de plusieurs façons? – Matt

Répondre

0

Il existe différentes façons de surmonter ce problème.

La première solution qui vient à l'esprit, qui est plus une solution rapide que n'importe quoi d'autre, est d'injecter le localisateur de service dans chaque contrôleur. Pour ce faire, vous devrez l'injecter dans le constructeur et changer votre usine pour les contrôleurs (usines si beaucoup d'entre eux). En faisant cela, vous ne pouvez injecter que le traducteur plutôt que le conteneur (gestionnaire de services).

Les initialiseurs sont en effet une solution, mais ils pourraient être supprimés plus tard. Je préférerais probablement utiliser un delegator. De cette façon, vous n'avez pas besoin d'injecter via le constructeur, mais vous devrez injecter via un setter, ce qui signifie que vous introduisez le couplage temporel ...

+0

Merci! La façon la plus appropriée semble être de l'injecter dans chaque contrôleur, donc seulement là où vous en avez besoin. Je cherche des exemples (de travail) parce que je suis nouveau dans ce domaine et que j'ai besoin d'une solution rapide pour continuer. J'ai trouvé une autre solution qui ne peut pas être utilisée aussi bien que controller_plugins sera supprimé dans ZF4, mais son tutoriel est parfait! https://daredevel.com/2017/04/to-setup-translate-controller-plugin-zend-framework-3/ – Matt

+0

Vous pouvez suivre le chemin proposé dans le tutoriel, c'est certainement valable pour ZF3. En ZF4, nous n'aurons probablement que des actions PSR7/PSR15, donc certainement pas de plugin. Si vous voulez aller dans ce sens, utilisez des routes middleware et injectez votre traducteur si nécessaire. –

+0

Je suis sûr que j'ai besoin d'aller en usine, j'ai toujours besoin d'un bon exemple pour m'assurer que je vais dans le bon sens, car il semble que les gens le font même de différentes façons en utilisant des usines. – Matt