2013-06-04 5 views
2

Как получить переводчик в модели?Zend framework 2 переводчик в модели

Внутренний вид мы можем получить переводчик, используя этот код

$this->translate('Text')

Внутри контроллера можно получить переводчик, используя этот код

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

$translator->translate("Text") ; 

Но как получить переводчика в модели?

Я пытался так много способов, чтобы получить обслуживание локатора в моделях 2 из этих

1) Использование MVC событий

$e=new MvcEvent(); 
    $sm=$e->getApplication()->getServiceManager(); 
    $this->translator = $sm->get('translator'); 

если я Принг $ см это показывает нуль. но он отлично работает в Model.php onBootstrap

2) Создан одна модель, которая реализует ServiceLocatorAwareInterface SomeModel.php

<?php 

namespace Web\Model; 

use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class SomeModel implements ServiceLocatorAwareInterface 
{ 
    protected $services; 

    public function setServiceLocator(ServiceLocatorInterface $locator) 
    { 
     $this->services = $locator; 
    } 

    public function getServiceLocator() 
    { 
     return $this->services; 
    } 
} 

и использовал это в моей модели

 $sl = new SomeModel(); 
     $sm=$sl->getServiceManager(); 
     var_dump($sm); exit; 
     $this->translator = $sm->get('translator'); 

это также печать null.

ответ

3

Если вам не нужен экземпляр servicemanager в вашей модели, просто введите экземпляр транслятора.

Например:

// Your model's constructor 

class MyModel { 
    // Use the trait if your php version >= 5.4.0 
    use \Zend\I18n\Translator\TranslatorAwareTrait; 

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

    public function modelMethodWhichNeedsToUseTranslator() 
    { 
    // ... 
    $text = $this->getTranslator()->translate('lorem ipsum'); 
    // ... 
    } 
} 

При создании модели в первый раз на службе или контроллер уровня

class someClass implements ServiceLocatorAwareInterface { 
    public function theMethodWhichCreatesYourModelInstance() 
    { 
    // ... 
    $sm = $this->getServiceLocator(); 
    $model = new \Namespace\MyModel($sm->get('translator')) 
    // ... 
    } 
} 

Если вам нужно создать экземпляр модели (новый MyModel();) на множестве методов/classes, подумайте о написании фабрики для этого.

Здесь представлена ​​хорошая статья о Dependency Injection and PHP от Ralph Schindler для получения более подробных комментариев об этом подходе.

0

Для вашего Model класса, который должен быть ServiceLocatorAware, вам необходимо не только реализовать интерфейс, но также необходимо сделать вашу модель службой сервис-менеджера и получить модель оттуда.

Добавьте свою модель в диспетчер службы, так как она не нуждается в каких-либо параметрах конструктора, она invokable, поэтому вы можете добавить ее в массив invokables в конфигурацию менеджера служб. Вы можете сделать это с помощью метода getServiceConfig() в вашем Module классе ...

class Module 
{ 
    public function getServiceConfig() 
    { 
     return array(
      'invokables' => array(
       'SomeModel' => 'Fully\Qualified\ClassName\To\SomeModel', 
      ), 
     ); 
    } 
} 

Затем, вместо того, чтобы вызвать new ключевое слово, чтобы создать свой экземпляр модели, вы запрашиваете его из диспетчера службы, например, по телефону метод getServiceLocator() в действии контроллера ...

public function fooAction() 
{ 
    $sm = $this->getServiceLocator(); 
    $model = $sm->get('SomeModel'); 
} 

Когда ваша модель извлекается из диспетчера службы, службы initializer будет выглядеть, чтобы увидеть, если он реализует ServiceLocatorAwareInterface и автоматически вызывать setServiceLocator(), если он делает, передавая ей ины менеджер обслуживания.

+0

спасибо, но вы не поняли мой вопрос правильно –

+0

Действительно? Что я пропустил? – Crisp

+0

Не могли бы вы написать код, который должен соответствовать моему вопросу exatly. –