Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend验证-多个值_Php_Zend Framework_Zend Validate - Fatal编程技术网

Php Zend验证-多个值

Php Zend验证-多个值,php,zend-framework,zend-validate,Php,Zend Framework,Zend Validate,我想验证允许包含多个电子邮件地址的表单元素,这些地址由逗号和空格分隔 以下是我的代码: class My_Validate_EmailAddresses extends Zend_Validate_Abstract { const MSG_INVALID = 'msgInvalid'; /** @var Zend_Validate_EmailAddress */ protected static $_validatorEmailAddress; /** @va

我想验证允许包含多个电子邮件地址的表单元素,这些地址由逗号和空格分隔

以下是我的代码:

class My_Validate_EmailAddresses extends Zend_Validate_Abstract
{
    const MSG_INVALID = 'msgInvalid';

    /** @var Zend_Validate_EmailAddress */
    protected static $_validatorEmailAddress;

    /** @var array */
    protected $_messageTemplates = array(
        self::MSG_INVALID => "'%value%' is not a valid email address",
    );

    /**
     *
     * @return Zend_Validate_EmailAddress
     */
    public static function getValidatorEmailAddress()
    {
        if (is_null(self::$_validatorEmailAddress)) {
            self::$_validatorEmailAddress = new Zend_Validate_EmailAddress();
        }
        return self::$_validatorEmailAddress;
    }

    /**
     * Values passed in here should be filterd by My_Filter_CommaSpaceSeparated first
     *
     * @param string $value
     * @return boolean
     */
    public function isValid($value)
    {
        $valid = true;
        $emails = explode(', ', $value);
        foreach ($emails as $email) {
            if (!self::getValidatorEmailAddress()->isValid($email)) {
                $this->_error(self::MSG_INVALID, $email);
                $valid = false;
            }
        }
        return $valid;
    }
}

它正确验证,但如果列表中有多个电子邮件地址未验证,则只显示最后一个电子邮件地址的错误消息。我希望看到每个无效电子邮件地址的消息。

由于$this->\u error()方法的当前实现,您无法做到这一点。 但是您可以将所有未验证的电子邮件放入一个字符串中,然后将其传递给_error()


我使用电子邮件地址作为
$\u messageTemplates
数组中的消息键,解决了多条消息的问题。我还创建了一个电子邮件验证类,然后将其扩展为多个验证

单个电子邮件地址

class My_Validate_EmailAddress extends Zend_Validate_Abstract
{
    const MSG_INVALID = "'%value%' is not a valid email address";

    /** @var Zend_Validate_EmailAddress */
    protected static $_validatorEmailAddress;

    /** @var array */
    protected $_messageTemplates = array();

    /**
     *
     * @return Zend_Validate_EmailAddress
     */
    public static function getValidatorEmailAddress()
    {
        if (is_null(self::$_validatorEmailAddress)) {
            self::$_validatorEmailAddress = new Zend_Validate_EmailAddress();
        }
        return self::$_validatorEmailAddress;
    }

    /**
     *
     * @param string $value
     * @return boolean
     */
    public function isValid($value)
    {
        $valid = true;
        if (!self::getValidatorEmailAddress()->isValid($value)) {
            $this->_messageTemplates[$value] = self::MSG_INVALID;
            $this->_error($value, $value);
            $valid = false;
        }
        return $valid;
    }
}
class My_Validate_EmailAddresses extends My_Validate_EmailAddress
{
    /**
     * Values passed in here should be filterd by My_Filter_CommaSpaceSeparated first
     *
     * @param string $value
     * @return boolean
     */
    public function isValid($value)
    {
        $valid = true;
        $emails = explode(', ', $value);
        foreach ($emails as $email) {
            if (!parent::isValid($email)) {
                $valid = false;
            }
        }
        return $valid;
    }
}
多个电子邮件地址

class My_Validate_EmailAddress extends Zend_Validate_Abstract
{
    const MSG_INVALID = "'%value%' is not a valid email address";

    /** @var Zend_Validate_EmailAddress */
    protected static $_validatorEmailAddress;

    /** @var array */
    protected $_messageTemplates = array();

    /**
     *
     * @return Zend_Validate_EmailAddress
     */
    public static function getValidatorEmailAddress()
    {
        if (is_null(self::$_validatorEmailAddress)) {
            self::$_validatorEmailAddress = new Zend_Validate_EmailAddress();
        }
        return self::$_validatorEmailAddress;
    }

    /**
     *
     * @param string $value
     * @return boolean
     */
    public function isValid($value)
    {
        $valid = true;
        if (!self::getValidatorEmailAddress()->isValid($value)) {
            $this->_messageTemplates[$value] = self::MSG_INVALID;
            $this->_error($value, $value);
            $valid = false;
        }
        return $valid;
    }
}
class My_Validate_EmailAddresses extends My_Validate_EmailAddress
{
    /**
     * Values passed in here should be filterd by My_Filter_CommaSpaceSeparated first
     *
     * @param string $value
     * @return boolean
     */
    public function isValid($value)
    {
        $valid = true;
        $emails = explode(', ', $value);
        foreach ($emails as $email) {
            if (!parent::isValid($email)) {
                $valid = false;
            }
        }
        return $valid;
    }
}
逗号和空格过滤器

class My_Filter_CommaSpaceSeparated implements Zend_Filter_Interface
{
    /**
     *
     * @param string $value
     * @return string
     */
    public function filter($value)
    {
        // normalize delimiters
        $value = str_replace(array(' ', ';'), ',', $value);
        // explode values
        $values = explode(',', $value);
        // remove empty values
        $values = array_filter($values);
        // implode
        $value = implode(', ', $values);
        // return filtered value
        return $value;
    }
}

谢谢你,阿康!我想我必须走这条路,但我找到了另一条我更喜欢的路。我很快就会发布的。刚刚发布。再次感谢您的解决方案,对于不同的情况,这可能是一个更好的解决方案。