Php ZF2正在将0传递给所需的formfield

Php ZF2正在将0传递给所需的formfield,php,zend-framework2,zend-form-element,Php,Zend Framework2,Zend Form Element,好吧,我在这里有点沮丧。 根据下面的代码,似乎不可能将“0”传递给Zend Framework 2中所需的formfield,而不使其获得“无效”状态 // FLOAT (0.0) if ($type >= self::FLOAT) { $type -= self::FLOAT; if (is_float($value) && ($value == 0.0)) { $this->error(self::I

好吧,我在这里有点沮丧。 根据下面的代码,似乎不可能将“0”传递给Zend Framework 2中所需的formfield,而不使其获得“无效”状态

// FLOAT (0.0)
    if ($type >= self::FLOAT) {
        $type -= self::FLOAT;
        if (is_float($value) && ($value == 0.0)) {
            $this->error(self::IS_EMPTY);
            return false;
        }
    }

    // INTEGER (0)
    if ($type >= self::INTEGER) {
        $type -= self::INTEGER;
        if (is_int($value) && ($value == 0)) {
            $this->error(self::IS_EMPTY);
            return false;
        }
    }
此代码来自“Zend\Validator\NotEmpty”,由inputFilterSpecification()方法中的属性“required=true”调用

那么我的问题是:为什么?在我看来,0是一个完全有效的整数,0.0是一个完全有效的浮点数

此外:如何在保持“required=true”的同时避免此验证?你知道,我的领域仍然需要

这是我的表单元素:

$this->add(
    array(
        'name' => 'price',
        'type' => 'Zend\Form\Element\Text',
        'options' => array(
           'label' => 'Price'
        )
   )
);
这是我的inputFilterSpecification:

'price' => array(
    'required' => true,
    'validators' => array(
        array(
            'name' => 'Float',
        ),
    ),
    'filters' => array (
        array(
           'name' => 'Shop\Form\Filter\CurrencyFilter',
        )
    ),
),

只需像这样从zf2扩展验证器类

namespace Application\Validator;

use Zend\Validator\NotEmpty;

class NotEmptyAllowZero extends NotEmpty {

    public function isValid( $value ) {

        $type = $this->getType();

        // allow zero float
        if($type >= self::FLOAT && $value == 0.0) {
            return true;
        }
        // allow integer zero
        if ($type >= self::INTEGER && $value == 0) {
            return true;
        }

        // go on with zend validator
        return parent::isValid( $value );
    }

}
在模块配置中注册自定义验证器(如Application/Config.php)

您可以将其用作验证器(!而不是筛选器)


您可以扩展验证器并允许零值,这将是一个选项,但随后我被迫将“required”设置为false,并使用自定义版本的“NotEmpty”验证器。我希望有一种更优雅的方式。这个答案可能会有所帮助->
'service_manager'    => array(
    'invokables' => array(
        'NotEmptyAllowZero'            => 'Application\Validator\NotEmptyAllowZero'
    )
)
'price' => array(
    'required' => true,
    'validators' => array(
        array(
            'name' => '\Application\Validator\NotEmptyAllowZero',
        ),
    ),
    'filters' => array (
        array(
            'name' => 'Shop\Form\Filter\CurrencyFilter',
        )
    ),
),