【问题标题】:Zf2 Translation Validator with Text Domain带有文本域的 Zf2 翻译验证器
【发布时间】:2014-08-16 10:05:00
【问题描述】:

我的翻译器有问题。我想为每个模块使用一个模块特定的文本域(NAMESPACE)。首先,我看到 ZF2 从 2.2 版开始需要将翻译器注入验证器,所以我在我的 Application\Module.php 中做了一些这样的想法

class Module
{
    public function onBootstrap(\Zend\Mvc\MvcEvent $e)
    {
        $translator = new \Zend\Mvc\I18n\Translator(
            $e->getApplication()->getServiceManager()->get('translator')
        );

        \Zend\Validator\AbstractValidator::setDefaultTranslator($translator);
    }
}

这可以注入默认的翻译器。所以现在我需要为验证器设置 TextDomain。当时我通过验证器工厂为每个模块验证器设置它们,例如

Class PasswordFactory implements FactoryInterface
{
    public function CreateServcie(ServiceLocatorInterface $sl) {
        $validator = new PasswordValidator();
        $validator->setTranslatorTextDomain('User'); // User = Module namespace
    }
}

这可行,但它有点乏味并且使代码膨胀。 那么有没有一种简单的方法来处理验证器的 TextDomains?例如在 Event:Dispatch 或通过 Initializer 附加它们?

问候

【问题讨论】:

  • 你是否只从模块User 调用PasswordFactory ?如果正确,您可以在PasswordFactory 中创建__construct() 并调用\Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain('User');

标签: php validation zend-framework2 zend-translate


【解决方案1】:

您可以在模块中设置默认TextDomain

class Module
{
    public function onBootstrap(\Zend\Mvc\MvcEvent $e)
    {
        ...
        \Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain(__NAMESPACE__);

是的,它不起作用,因为 NAMESPACE 获取本地 NAMESPACE

要获取当前的__NAMESPACE__,您可以使用MvcEvent::EVENT_DISPATCH 操作。

public function onBootstrap(MvcEvent $e)
{
    ...
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'setTextDomain'), 100);
}

public function setTextDomain(MvcEvent $e)
{
    $currentNameSpace = $e->getRouteMatch()->getParam('__NAMESPACE__');
    \Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain(currentNameSpace);
}

【讨论】:

  • 是的,我试过了。但我有这个问题。例如,当我有 2 个自定义模块并像这样在 application.config.php 返回数组('modules' => array( ...., 'User', 'UI') 中加载它们时,我会覆盖 DefaultTextDomain,所以当我尝试执行将在用户模块上获取的请求时,验证器默认具有 UI-TextDomain 的 TextDomain,因为 onBootstrap 设置器。我不知道,也许我做错了什么?
  • MvcEvent::EVENT_DISPATCH 将只为当前的module/controller/action 调用一次。不需要在每个 Module 上调用此事件。在默认模块中调用此事件,例如 Index
  • 好的,我已经尝试过了 - 会出现同样的问题,因为 application.config.php 模块加载中的安排,我得到了最后一个 loadet 模块的文本域。我不明白 \Zend\Validator\AbstractValidator::setDefaultTranslatorTextDomain 将是一个静态函数,因此存储将是全局定义的,我认为问题是,验证器在最后一组 TextDomain 之后调用?
  • 是的,我理解你!您从另一个模块调用另一个验证器。
  • 如果您从模块调用另一个模块,您的解决方案是正确的!需要将带有域名的TextDomain 设置为验证器,因为您从另一个模块调用验证器并且ZF 不知道新的__NAMESPACE__
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多