php - 将输入过滤器添加到 ZF2 中的字段集

标签 php zend-framework2

我有一个表单 Register,它有一个字段集 Profile,它又有一个字段集 Account。字段集实现了 InputFilterProviderInterface,因此实现了 getInputFilterSpecification 方法。这是我添加了通用验证器和过滤器的地方,只要使用字段集就应该使用它们。

现在,在我的注册表中,我想验证具有给定用户名的帐户是否不存在。因此,我需要添加一个验证器来补充在 Account 字段集中定义的验证器。这就是我遇到麻烦的地方。经过一番挖掘,我发现了一个 way to add input filters to fieldsets .这样,我想,我可以向我的 Account 字段集添加一个额外的输入过滤器。

class Register extends Zend\InputFilter\InputFilter
{
    public function __construct()
    {
        $this->add(new RegisterProfileFilter(), 'profile');
    }
}

使用上面的代码,我可以向我的 Profile 字段集添加一个输入过滤器,并且在该输入过滤器中,我可以为我的 account 字段集做同样的事情.但是,这种方法似乎有两个问题:

  1. 似乎我必须为层次结构中的每个字段集创建一个输入过滤器;在这种情况下,我必须为 Profile 字段集创建一个输入过滤器,以便我可以将输入过滤器添加到 Account 字段集 - 即使我不需要将任何验证器或任何东西添加到 Profile 字段集中。如果我尝试将过滤器直接添加到 account 字段集
  2. ,它不起作用
  3. 似乎将输入过滤器对象添加到字段集会清除我在字段集的 getInputFilterSpecification 方法中定义的过滤器,而不是像我想要的那样合并两者

有没有办法将我的字段集上定义的输入过滤器规范与附加规范(或 Zend\InputFilter\InputFilter 的实例)合并,这样我就不必将我的字段集规范复制到我的输入过滤器类?那将是重复的代码并且不太易于维护。还是我遗漏了什么导致我走错了路?

下面是我的代码,如果它有任何帮助的话。

// The code has been altered to be more self-explanatory and shorter

class RegisterForm extends \Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct('register');

        // Elements are added here

        $profileFieldset = new ProfileFieldset();
        $profileFieldset->setUseAsBaseFieldset(true);
        $this->add($profileFieldset);
    }
}


class ProfileFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('profile');

        // Elements are added here

        $this->add(new AccountFieldset());
    }

    public function getInputFilterSpecification()
    {
        return array(
            /***** The below is apparently cleared when adding an input filter to this fieldset *****/
            'some_element1' => array(
                'required' => false,
            ),
            'some_element2' => array(
                'required' => false,
            ),
        );
    }
}


class AccountFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('account');

        // Elements are added here
    }

    public function getInputFilterSpecification()
    {
        return array(
            /***** This is the element that I want to add an additional validator to in a specific context (form) *****/
            'username' => array(
                'required' => true,
                'validators' => array(
                    new Validator\StringLength(array(
                        'min' => 4,
                        'max' => 15,
                    )),
                    new I18nValidator\Alnum(false),
                ),
            ),

            // Other elements here
        );
    }
}

最佳答案

Zend\Form 中没有很好地介绍合并 InputFilters零件。必须有人真正重构整个事情。

无论如何,在您的情况下,我建议在通过覆盖 getInputFilter 创建整个 InputFilter 之后添加验证器。表单中的方法。

class RegisterForm extends \Zend\Form\Form
{
    public function __construct()
    {
        // add stuff
    }

    public function getInputFilter()
    {
        $formInputFilter = parent::getInputFilter();
        $usernameInput = $formInputFilter->get('profile')->get('account')->get('username');

        $myValidator = new Validator\SomeValidator();
        $usernameInput->getValidatorChain()->addValidator($myValidator);

        return $formInputFilter;
    }
}    

作为旁注,我建议定义 InputFiltersForm基础而不是根据 Fieldset ,因为元素在 Fieldset在不同的上下文(=表单)中经常有不同的“验证要求”。但也许这更多是个人喜好。

关于php - 将输入过滤器添加到 ZF2 中的字段集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201577/

相关文章:

php - 根据父类别排序 Wordpress 帖子

php - 当某些参数可能为NULL时,如何在php文件中编写mySQL搜索查询?

php - 如何使用相同的 CakePhp 设置开发网站和 API

javascript - 通过 Controller 操作 zf2 附加 javascript

php - 如何清除 Zend framework2 中的 session 容器

php - 如何从查询字符串中获取 boolean 值?

php - Laravel 5 批量插入关系

php - 配置 ZF2 view_manager 以加载 2 个单独的模板映射

php - 分页时出错

php - 如何使用 zend2 和 dompdf 创建 pdf