我正在使用Zend的一些模型抽象类。
我几个月前在Zend Quick Start文档中找到了这个解决方案。但是在过去的几个月里,我遇到了一些处理空值的问题。
我有一个Zend_Form_Element_Select元素,它从数据库中获取了它的值。它的值是来自外键的ID。因此,只接受有效的外键id或null。但是Zend_Form_Element_Select元素是可选的,因此我可能会得到一个空字符串( - > addMultiOption(null,'选择你的选项'))。但是这会给我一个错误,因为空字符串不是有效的外键id也不是null,这也是允许的。
我的第一个尝试是检查处理表单的控制器,如果select元素值是一个emptry字符串并将其更改为null。这很难看,问题是,我的setter将null更改为0,因为我用(int)$ value验证它。
public function setId($value)
{
$this->_id = (int) $value;
return $this;
}
另一种方法是我检查我的setter,如果值为null,那么我不用(int)验证它。这看起来就像那样。
public function setId($value)
{
if($value !== null)
$this->_id = (int) $value;
return $this;
}
这种情况适用于这种情况,但我没有意义,因为有时我想将现有值重置为null。所以我不能忽略setter中带null的值。所以另一种方法是:
public function setId($value)
{
if($value !== null)
$this->_id = (int) $value;
else
$this->_id = null;
return $this;
}
但现在它真的很难看。我很想知道你们会怎样解决这个问题。因为我认为必须有简单的解决方案,而不仅仅是在setter中删除(int)。因为据我所知,这似乎是使用setter的常用方法。
祝你好运, 尼科
答案 0 :(得分:1)
我想不出任何其他方式来做这个逻辑方面。如果您发现这个过于冗长,可以将if/else
转换为三元运算符表达式。这将使它成为一个单行。
$this->_id = ($value !== NULL) ? (int) $value : NULL;
return $this;
另一种选择是将您的if/else
移至Zend_Filter
之类的自定义NullOrInt
。这可以在您需要此检查的任何地方重复使用,例如在控制器级别验证请求输入或在Zend_Form
或您的Setter等中