我在我的魔术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"
}
}
很抱歉长粘贴,但我觉得理解这个问题很重要。
答案 0 :(得分:1)
安迪,
我已经复制了这个确切的功能,并且已经意识到必须设置验证器才能处理字段,尽管我注意到布尔过滤器会返回1作为字符串而不是true,而null表示false但是我将在以后更深入地潜水。请尝试为其余字段设置NotEmpty验证器。