2013-01-10 22 views
8

एक यूआरएल पुनर्निर्देशन के लिए मुझे नियंत्रक में कुछ अनुवाद करने की आवश्यकता है।जेडएफ 2 नियंत्रक का उपयोग नियंत्रक

मैं यह कैसे प्राप्त कर सकता हूं-> अनुवाद(); नियंत्रक में?

धन्यवाद! निक

उत्तर

17

अनुवाद Translator के माध्यम से किया जाता है। अनुवादक एक ऑब्जेक्ट है और एक उदाहरण सहायक में उदाहरण के लिए इंजेक्शन दिया जाता है, इसलिए यदि आप उस दृश्य सहायक को कॉल करते हैं, तो यह आपके तारों का अनुवाद करने के लिए अनुवादक का उपयोग करता है। इस उत्तर के लिए मुझे लगता है कि आपने अनुवादक just the same as the skeleton application कॉन्फ़िगर किया है।

फैक्ट्री का उपयोग अपने नियंत्रक में निर्भरता के रूप में इंजेक्ट करने के लिए सबसे अच्छा तरीका है। नियंत्रक config:

'controllers' => array(
    'factories' => array(
    'my-controller' => function($sm) { 
     $translator = $sm->getServiceLocator()->get('translator'); 
     $controller = new MyModule\Controller\FooController($translator); 
    } 
) 
) 

और नियंत्रक ही:

namespace MyModule; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\I18n\Translator\Translator; 

class FooController extends AbstractActionController 
{ 
    protected $translator; 

    public function __construct(Translator $translator) 
    { 
    $this->translator = $translator; 
    } 
} 

एक वैकल्पिक अपनी कार्रवाई में सेवा प्रबंधक से अनुवादक खींचने के लिए है, लेकिन यह, कम लचीला कम परीक्षण योग्य है और कठिन बनाए रखने के लिए है :

public function fooAction() 
{ 
    $translator = $this->getServiceManager()->get('translator'); 
} 

दोनों ही मामलों आप $translator->translate('foo bar baz') उपयोग कर सकते हैं आपकी स्ट्रिंग का अनुवाद करने के लिए।

+0

जेडएफ 2 के नवीनतम संस्करण ने अनुवादक की कुंजी को 'एमवीसीट्रांसलेटर' में बदल दिया। – MKroeders

+0

मेरे लिए काम नहीं करता है। मुझे निम्न त्रुटि मिली है: पकड़ने योग्य घातक त्रुटि: आवेदन 1 नियंत्रक \ CorrespondenciasController :: __ निर्माण() को पास किया गया तर्क 1) ज़ेंड \ I18n \ Translator \ Translator का एक उदाहरण होना चाहिए, कोई भी नहीं दिया गया है, जिसे/home/inhotim में बुलाया गया है /Trabalho/0-OPE/scape/Produçà sharpo/Web/scape/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php लाइन 207 पर और/home/inhotim/Trabalho/0-OPE/scape में परिभाषित /Produçà sharpo/Web/scape/module/Application/src/Application/Controller/CorrespondenciasController.php लाइन 141 –

+0

@ गुस्तावो गोंसाल्व्स का मतलब है कि आपका कारखाना काम नहीं कर रहा है। मेरे उत्तर में पहला कोड ब्लॉक देखें। –

1

मुझे लगता है कि वहाँ यह करने के लिए एक अच्छा तरीका है:

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

आप बस ऐसे ही दृश्य की ही तरह नियंत्रक में अनुवादक का उपयोग करना चाहते हैं,:

$this->translate('Hello') 
बजाय

बदसूरत :

$this->getServiceLocator()->get('translator')->translate('Hello') 

आप अनुवाद प्लगइन भी लिख सकते हैं नियंत्रक, बस सहायक Zend\I18n\View\Helper\Translate देखें।

बेशक

, आप एक ही हस्ताक्षर के साथ प्लगइन आह्वान कर सकते हैं:

__invoke($message, $textDomain = null, $locale = null) 

बस रजिस्टर:

'controller_plugins' => array(
    'factories' => array(
     'translate' => 'Application\Controller\Plugin\Translate', 
    ), 
), 

और प्लगइन लिखें:

<?php 

namespace Application\Controller\Plugin; 

use Zend\Mvc\Controller\Plugin\AbstractPlugin; 

use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\ServiceManager\FactoryInterface; 

use Zend\I18n\Translator\Translator; 

class Translate implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $serviceLocator = $serviceLocator->getController()->getServiceLocator(); 
     $serviceFactory = new TranslatorServiceFactory(); 
     $translator = $serviceFactory->createService($serviceLocator); 

     return new TranslatorProxy($translator); 
    } 
} 

final class TranslatorProxy extends AbstractPlugin 
{ 
    private $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function __invoke($message, $textDomain = 'default', $locale = null) 
    { 
     return $this->translator->translate($message, $textDomain, $locale); 
    } 

    public function __call($method, $args) 
    { 
     return call_user_func_array([$this->translator, $method], $args); 
    } 

    public static function __callstatic($method, $args) 
    { 
     return call_user_func_array([$this->translator, $method], $args); 
    } 
} 

यह कैसे काम करता? तुम देखो, ServiceLocator विन्यास अंतरिक्ष controller_plugins में

createService(ServiceLocatorInterface $serviceLocator) 

कारखाने में पारित कर दिया, करता नियंत्रक में ServiceLocator में Config सेवा करने के लिए कोई उपयोग कर सकते है। तो आप कॉन्फ़िगरेशन नहीं प्राप्त कर सकते हैं और ऑब्जेक्ट TranslatorServiceFactory के माध्यम से बना सकते हैं।

इसके बजाए, $serviceLocator->getController() टाइप करके, हमारे नियंत्रक को सौंपा गया ServiceLocator तक पहुंच सकता है।

बेशक, $serviceLocatorcreateService विधि में Zend\Mvc\Controller\PluginManager का उदाहरण है।

प्रॉक्सी क्यों? वस्तु प्लगइन कारखाने के माध्यम से लौटे

Zend\Mvc\Controller\Plugin\PluginInterface 

जो सिद्धांत

Zend\Mvc\Controller\Plugin\AbstractPlugin 

में कार्यान्वित किया जाता तो हम प्रॉक्सी वस्तु बनाया Translate वस्तु के लिए हमारी प्लगइन से सभी कॉल अग्रेषित करने के कार्यान्वित करना होगा।

आशा है कि इससे मदद मिलेगी!

मैंने अपने ब्लॉग में एक लेख प्रकाशित किया है।

+0

यह सही दिखता है और साथ ही केंद्रीकृत काम करता है। धन्यवाद @ एथलान! – smozgur

+0

आपका olution अच्छा लग रहा है! धन्यवाद! और आप पोलैंड से हैं :) –

+0

मेरे लिए काम नहीं करता है? क्या गुम है? 1- मैं मॉड्यूल के तहत model.config.php में प्लगइन पंजीकृत करता हूं। 2- मैं अनुप्रयोग \ नियंत्रक \ प्लगइन में translater.class बनाते हैं। 4- मैं इसे एक अन्य नियंत्रक में $-- अनुवाद ('हैलो', __ NAMESPACE __, $ mylocale) कहता हूं। – Oskar

-1

आप इसे इस तरह से कर सकते हैं:

$translate = $this->getServiceLocator()->get('viewhelpermanager')->get('translate'); 
0
$translator = $this->getServiceManager()->get('MVCTranslator'); 
0

मेरे मामले में पूरी तरह से इस समाधान काम करता है:

namespace MyNS; 
class MyCtrlr 
{ 
    protected $translator; 

    public function getTranslator() 
    { 
     if (!$this->translator) 
     { 
      $sm = $this->getServiceLocator(); 
      $this->translator = $sm->get('translator'); 
     } 
     return $this->translator; 
    } 

    public function myAction() 
    { 
     $sTrHello = $this->getTranslator()->translate('Hello'); 
     /* 
     * More code here 
     */ 
    } 

} 
0

एक invokable एक वर्ग है कि किसी भी तर्क के बिना निर्माण किया जा सकता है । चूंकि हमारे MyModule \ Controller \ FooController के पास अब एक आवश्यक तर्क है, हमें इसे बदलने की आवश्यकता है। एक फैक्टरी एक वर्ग है जो किसी अन्य वर्ग के उदाहरण बनाता है। अब हम अपने FooController के लिए एक बना देंगे। के इस तरह हमारे module.config.php फ़ाइल को संशोधित करते हैं:

return array(
    'view_manager' => array(/** ViewManager Config */), 
    'controllers' => array(
     'invokables' => array(
      //'MyModule\Controller\Foo' => 'MyModule\Controller\FooController' 
     ), 
     'factories' => array(
      'MyModule\Controller\Foo' => 'MyModule\Factory\FooControllerFactory', 
     ) 
    ), 
    'router' => array(/** Router Config */) 
); 

इस में एक नया फ़ोल्डर बनाने के लिए है, हमारे कारखाने वर्ग को लागू करते हैं \ मॉड्यूल \ MyModule \ src \ MyModule \ फैक्टरी और नई फ़ाइल कहा जाता FooControllerFactory .php:

<?php 
namespace MyModule\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use MyModule\Controller\FooController; 

class FooControllerFactory implements FactoryInterface 
{ 

    public function __construct() 
    {} 

    /** 
    * Create service 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * 
    * @return mixed 
    */  
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $realServiceLocator = $serviceLocator->getServiceLocator(); 
     $translator   = $realServiceLocator->get('translator'); 

     return new FooController($translator); 
    } 
} 

अब चलो हमारे FooController भीतर $ अनुवादक उपयोग करते हैं। इसके लिए हमें डिफ़ॉल्ट __contruct() अधिलेखित करने के लिए की आवश्यकता होगी:

<?php 
namespace MyModule\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Mvc\I18n\Translator; 

class FooController extends AbstractActionController 
{ 
    protected $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function FooAction() 
    { 
     ... 
     $msg = $this->translator->translate('Blah blah blah'); 
     ... 
    } 
} 

मेरे मामले में ठीक काम करता है !!!

संबंधित मुद्दे