Validation ZF2:允许空字段集,但验证是否至少填写了一个字段集

Validation ZF2:允许空字段集,但验证是否至少填写了一个字段集,validation,zend-framework2,fieldset,Validation,Zend Framework2,Fieldset,我已经为电话号码定义了一个字段集。其中包含字段“类型”(私人、办公移动…)和“编号”。数字的输入筛选器为“required=>true”: `` `` 我可以将验证器/过滤器附加到整个字段集吗?因此,如果“type”和“number”为空,则字段集是有效的,但验证是否至少填写了一个字段集?我找到了一个易于使用的解决方案,尽管我不再使用表单,但我现在大量使用输入过滤器,仍然需要相同的内容。但找到了一个简单的解决办法 AbstractFilterValidator,我自己的实现 abstract c

我已经为电话号码定义了一个字段集。其中包含字段“类型”(私人、办公移动…)和“编号”。数字的输入筛选器为“required=>true”:

``

``


我可以将验证器/过滤器附加到整个字段集吗?因此,如果“type”和“number”为空,则字段集是有效的,但验证是否至少填写了一个字段集?

我找到了一个易于使用的解决方案,尽管我不再使用表单,但我现在大量使用
输入过滤器
,仍然需要相同的内容。但找到了一个简单的解决办法

AbstractFilterValidator
,我自己的实现

abstract class AbstractFilterValidator extends AbstractValidator
{
    /**
     * Returns true if and only if $value meets the validation requirements
     *
     * If $value fails validation, then this method returns false, and
     * getMessages() will return an array of messages that explain why the
     * validation failed.
     *
     * @param  mixed $value
     * @return bool
     * @throws Exception\RuntimeException If validation of $value is impossible
     */
    public function isValid($value)
    {
        $this->setValue($value);
        $filter = $this->buildFilter();
        $filter->setData($value);

        if (!$filter->isValid()) {
            $this->abstractOptions['messages'] = $filter->getMessages();
            return false;
        }
        return true;
    }

    /**
     * @return array
     */
    public function getMessages()
    {
        return $this->abstractOptions['messages'];
    }

    /**
     * @return InputFilter\InputFilter
     */
    abstract protected function buildFilter();
}

旧答案

虽然您使用的是
InputFilterProviderInterface
,但我使用的是
Zend\InputFilter\InputFilter
,希望与您相同。如果未填写字段集,请验证
true

为此,我将
isValid
替换为以下内容:

public function isValid()
{
    $values = array_filter($this->getRawValues());
    if (empty($values)) {
        return true;
    }

    return parent::isValid();
}
它只是从所有空数组键中筛选数组,有关信息,请参阅。然后检查
$values
是否为空,如果为空,则返回
true
。否则将调用验证器


嗯,我又需要一些东西,但需要一个像样的解决方案。仍然没有找到一个好的,所以我写了下面的代码

<?php
namespace Application\InputFilter;

use Zend\InputFilter as ZFI;

class InputFilter extends ZFI\InputFilter
{
    private $required = true;

    /**
     * @return boolean
     */
    public function isRequired()
    {
        return $this->required;
    }

    /**
     * @param boolean $required
     *
     * @return $this
     */
    public function setRequired($required)
    {
        $this->required = (bool) $required;
        return $this;
    }

    /**
     * @return bool
     */
    public function isValid()
    {
        if (!$this->isRequired() && empty(array_filter($this->getRawValues()))) {
            return true;
        }

        return parent::isValid();
    }
}

你成功了吗?谢谢你的最后一点:-)但是你的
AbstractFilterValidator
解决方案如何与你的
InputFilter
类抗衡呢?假设您将后者替换为前者,使其更好/更高效?我们从ZF2开始,转而支持其他库,因为我们编写的验证是我们自己的库,它支持这种行为等等。所以我不能告诉你哪个更好
<?php
namespace Application\InputFilter;

use Zend\InputFilter as ZFI;

class InputFilter extends ZFI\InputFilter
{
    private $required = true;

    /**
     * @return boolean
     */
    public function isRequired()
    {
        return $this->required;
    }

    /**
     * @param boolean $required
     *
     * @return $this
     */
    public function setRequired($required)
    {
        $this->required = (bool) $required;
        return $this;
    }

    /**
     * @return bool
     */
    public function isValid()
    {
        if (!$this->isRequired() && empty(array_filter($this->getRawValues()))) {
            return true;
        }

        return parent::isValid();
    }
}