Zend_Filter_Input过滤不触发

时间:2010-01-30 19:05:03

标签: php zend-framework zend-filter

我在我的魔术getter / setter方法上使用Zend_Filter_Input来验证我的输入并将字段转换为我想要的类型。验证部分工作得很好,但就像过滤器根本没有触发一样。以下是我模型中的相关逻辑:

    public function getFilters() {
        $filters = array(
            '*'             =>  array('StringTrim'),
            'email_opt_in'  =>  array('Boolean'),
            'admin'         =>  array('Boolean'),
            'active'        =>  array('Boolean'),
            'phone'         =>  array('Digits'),
            'activated'     =>  array('Boolean'),
            'id'            =>  array('Int'),
            'birthyear'     =>  array('Int'),
            'username'      =>  array('StringToLower')
        );
        return $filters;
    }

    public function getValidators() {
        $validators = array(
            'email'     =>  array('EmailAddress'),
            'username'  =>  array('Alnum'),
            'first'     =>  array('Alpha'),
            'last'      =>  array('Alpha'),
            'birthyear' =>  array('Digits'),
            'phone'     =>  array('Digits')
        );
        return $validators;
    }

    public function __set($name, $value) {
        if (!array_key_exists($name,$this->_data)) {
            throw new Exception('Unknown property: ' . $name);
        }
        $input = new Zend_Filter_Input($this->getFilters(), $this->getValidators(), array($name => $value));

        if ($input->isValid()) {
            if (isset($input->$name)) {
                $this->_data[$name] = $input->$name;
            } else {
                $this->_data[$name] = $value;
            }
        } else {
            throw new Exception('The following fields contain invalid values: ' . implode(',',array_keys($input->getInvalid())));
        }
    }

然而,输出结果如下:

object(MyApp_Model_User)#19 (1) {
  ["_data:protected"]=>
  array(15) {
    ["id"]=>
    string(1) "4"
    ["email"]=>
    string(19) "example@example.com"
    ["password"]=>
    string(32) "594851275f207072b172d7508f037d78"
    ["username"]=>
    string(6) "jdoe"
    ["first"]=>
    string(4) "Joe"
    ["last"]=>
    string(5) "Doe"
    ["phone"]=>
    string(10) "1112223333"
    ["email_opt_in"]=>
    int(1)
    ["zip"]=>
    string(5) "55555"
    ["birthyear"]=>
    string(4) "1984"
    ["gender"]=>
    string(4) "male"
    ["activated"]=>
    int(1)
    ["date_joined"]=>
    string(10) "2008-03-11"
    ["admin"]=>
    string(1) "1"
    ["active"]=>
    string(1) "1"
  }
}

很抱歉长粘贴,但我觉得理解这个问题很重要。

1 个答案:

答案 0 :(得分:1)

安迪,

我已经复制了这个确切的功能,并且已经意识到必须设置验证器才能处理字段,尽管我注意到布尔过滤器会返回1作为字符串而不是true,而null表示false但是我将在以后更深入地潜水。请尝试为其余字段设置NotEmpty验证器。