9

URL リダイレクトの場合、コントローラーで何かを変換する必要があります。

どうすれば $this->translate(); にアクセスできますか? コントローラーで?

ありがとう!ニック

4

7 に答える 7

18

翻訳は を介し​​て行われTranslatorます。トランスレーターはオブジェクトであり、たとえばビュー ヘルパーに挿入されるため、そのビュー ヘルパーを呼び出すと、トランスレーターを使用して文字列を翻訳します。この回答では、トランスレータをスケルトン アプリケーションと同じように構成したと仮定します。

最良の方法は、ファクトリを使用してこれを依存関係としてコントローラーに注入することです。コントローラー構成:

'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')、文字列の翻訳に使用できます。

于 2013-01-10T18:07:24.080 に答える
11

ビューのようにコントローラーでトランスレーターを使用する場合は、次のようにします。

$this->translate('Hello')

醜いの代わりに:

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

view helper と同じように、コントローラー用の変換プラグインを作成することもできます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渡された

createService(ServiceLocatorInterface $serviceLocator)

factory in configuration spaceは、コントローラー内のサービスにcontroller_pluginsアクセスできません。したがって、構成を取得してオブジェクトを作成することはできません。ConfigServiceLocatorTranslateTranslatorServiceFactory

ServiceLocatorその代わりに、と入力して、ヘルパーが呼び出されたコントローラーに割り当てられた にアクセスできます$serviceLocator->getController()

もちろん、メソッドに$serviceLocator渡されるcreateServiceのは のインスタンスですZend\Mvc\Controller\PluginManager

なぜプロキシ? プラグイン ファクトリを介して返されるオブジェクトは、実装する必要があります。

Zend\Mvc\Controller\Plugin\PluginInterface

これは抽象的に実装されています

Zend\Mvc\Controller\Plugin\AbstractPlugin

そのため、プラグインからのすべての呼び出しをオブジェクトに転送するプロキシ オブジェクトを作成しましたTranslate

それが役に立ったことを願っています!

自分のブログで記事を公開しました。

于 2013-06-29T19:00:33.200 に答える
1

私はそれを行うための最も良い方法があると思います:

$translator = $this->getServiceLocator()->get('translator');
$translator->translate('__your_key');
于 2013-02-15T14:17:17.040 に答える
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
         */
    }

}
于 2015-06-19T12:42:22.003 に答える
0
$translator = $this->getServiceManager()->get('MVCTranslator');
于 2015-02-10T17:22:58.053 に答える