ZF2在Validator类中使用视图助手

时间:2015-02-25 16:31:38

标签: localization zend-framework2 view-helpers service-locator

已更新! ZF2,l10n查看助手。我无法理解如何在类中使用我的视图助手。 我想使用它:$this->t('STRING TO TRANSLATE'); 吼叫的例子 NB!我只是本地化项目,我不允许改变代码结构或类似的东西。我也是ZF2中的绝对新手。 我的班级 -

class Project extends InputFilter{

据我所知,我必须实现ServiceLocatorAwareInterface接口,试过这个:

use Zend\ServiceManager\ServiceLocatorInterface as ServiceLocator;

class Project extends InputFilter implements ServiceLocator
{
    protected $services;

    public function __construct(Connection $p4, $mode, ServiceLocator $services)
    {
        $this->services = $services;

        //some code
        $this->add(...);

        $this->add(
            array(
                 'name'          => 'name',
                 'filters'       => array('trim'),
                 'validators'    => array(
                     array(
                         'name'      => 'NotEmpty',
                         'options'   => array(
                             'message'   =>  "Name is required and can't be empty."
                         )
                     ),
                     array(
                         'name'      => '\Application\Validator\Callback',
                         'options'   => array(
                             'callback'  => function ($value) use ($p4, $toId, $mode, $reserved) {
                                 $id = $toId($value);
                                 if (!$id) {
                                     return $this->t('STRING TO TRANSLATE');
                                 }

// more code here
                                 return true;
                             }
                         )
                     )
                 )
            )
        );         

        //some code
        $this->add(...);

     }    


    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
        $this->serviceLocator = $serviceLocator;
    }

    public function getServiceLocator() {
        return $this->serviceLocator;
    }
    //how to get this method work ???
    public function t($msg) {
        $translate = $this->services->get('ViewHelperManager')->get('t');
        return $translate($msg);
    }


}

Controller中的用法:

use Projects\Filter\Project as ProjectFilter;

...

protected function doAddEdit($mode, $project = null)
{
    $p4Admin = $this->getServiceLocator()->get('p4_admin');
    $request = $this->getRequest();

    // process add request.
    if ($request->isPost()) {
        // pull out the data
        $data = $request->getPost();

        // configure our filter with the p4 connection and add/edit mode
        $filter = new ProjectFilter($p4Admin, $mode); // 
        $filter->setData($data);

        // if the data is valid, setup the project and save it
        $isValid = $filter->isValid();
        if ($isValid) {
            $values  = $filter->getValues();
            $project = new Project($p4Admin);
            $project->set($values)
                ->save();
        }

        return new JsonModel(
            array(
                'isValid'   => $isValid,
                'messages'  => $filter->getMessages(), // THESE array of messages i want to localize
                'redirect'  => '/projects/' . $filter->getValue('id')
            )
        );
    }

    // prepare view for form.
    $view = new ViewModel;
    $view->setVariables(
        array(
             'mode'     => $mode,
             'project'  => $project ?: new Project
        )
    );

    return $view;
}

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您在类构造函数中调用tr方法。 tr方法调用$this->getServiceLocator()$this->getServiceLocator()不会返回服务定位器实例,因为它只会在创建实现ServiceLocatorAwareInterface的对象后由服务管理器注入。

因此,您必须将服务定位器实例传递给构造函数,或者不要在__construct方法中依赖它。可能最简单的方法是将代码从构造函数移动到init方法。只要您通过Init获得输入过滤器,就会自动调用InputFilterManager

此外,我认为您不需要translator视图助手。您应该可以从服务管理器获取它:$serviceManager->get('translator')

答案 1 :(得分:0)

无论如何都没有必要这样做验证消息将由验证器翻译。但是我认为你的配置有点不对。

    $this->add(
        array(
             'name'          => 'name',
             'filters'       => array('trim'),)
             'validators'    => array(
                 array(
                     'name'      => 'NotEmpty',
                     'options'   => array(
                         'messages' => array(
                                    \Zend\Validator\NotEmpty::IS_EMPTY => 'YOUR_TRANSLATION_STRING_IS_EMPTY',
                                    \Zend\Validator\NotEmpty::INVALID => 'YOUR_TRANSLATION_STRING_INVALID',
                          )
                     )
             )
     ),

阅读https://zf2-docs.readthedocs.org/en/latest/modules/zend.validator.html#translating-messages

您需要确保正确管理依赖项才能使其正常工作,这实际上取决于您使用输入过滤器的方式。

如果您没有直接添加到表单或使用模型上的InputFilterAwareInterface,您需要确保使用InputFilterPluginManager注册InputFilter并使用InputFilterPluginManager检索它而不是直接实例化