URL リダイレクトの場合、コントローラーで何かを変換する必要があります。
どうすれば $this->translate(); にアクセスできますか? コントローラーで?
ありがとう!ニック
URL リダイレクトの場合、コントローラーで何かを変換する必要があります。
どうすれば $this->translate(); にアクセスできますか? コントローラーで?
ありがとう!ニック
翻訳は を介して行われ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')
、文字列の翻訳に使用できます。
ビューのようにコントローラーでトランスレーターを使用する場合は、次のようにします。
$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
アクセスできません。したがって、構成を取得してオブジェクトを作成することはできません。Config
ServiceLocator
Translate
TranslatorServiceFactory
ServiceLocator
その代わりに、と入力して、ヘルパーが呼び出されたコントローラーに割り当てられた にアクセスできます$serviceLocator->getController()
。
もちろん、メソッドに$serviceLocator
渡されるcreateService
のは のインスタンスですZend\Mvc\Controller\PluginManager
。
なぜプロキシ? プラグイン ファクトリを介して返されるオブジェクトは、実装する必要があります。
Zend\Mvc\Controller\Plugin\PluginInterface
これは抽象的に実装されています
Zend\Mvc\Controller\Plugin\AbstractPlugin
そのため、プラグインからのすべての呼び出しをオブジェクトに転送するプロキシ オブジェクトを作成しましたTranslate
。
それが役に立ったことを願っています!
自分のブログで記事を公開しました。
私はそれを行うための最も良い方法があると思います:
$translator = $this->getServiceLocator()->get('translator');
$translator->translate('__your_key');
私の場合、このソリューションは完全に機能します:
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
*/
}
}
$translator = $this->getServiceManager()->get('MVCTranslator');