带文本域的Zf2翻译验证器

时间:2014-08-16 10:05:00

标签: php validation zend-framework2 zend-translate

我在翻译中遇到了问题。我想为每个模块使用模块特定的文本域( 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);
    }
}

这可以注入默认的转换器。所以现在我需要为Validators设置TextDomain。当时我通过Validator Factory为每个模块验证器设置它们,如

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

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

中附加它们

问候

1 个答案:

答案 0 :(得分:0)

您可以在模块

中设置默认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);
}