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');

如果我 pring $sm 它显示为空。但它在 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');

这也打印空。

4

2 回答 2

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') )
    // ...
    }
}

如果您需要在多个方法/类上实例化您的模型(new MyModel();),请考虑为它编写一个工厂。

这是 Ralph Schindler 撰写的一篇关于Dependency Injection 和 PHP的精彩文章,以获得有关此方法的更详细评论。

于 2013-06-06T07:51:54.667 回答
0

要使您的Model类成为ServiceLocatorAware,您不仅需要实现接口,还需要使您的模型成为服务管理器的服务,并从那里获取模型。

将您的模型添加到服务管理器,因为它似乎不需要任何构造函数参数,它是可调用的,因此您可以将它添加到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(),并将服务管理器的实例传递给它。

于 2013-06-05T10:16:02.337 回答