Zend框架模型Abstract和null值

时间:2010-12-09 09:15:06

标签: php zend-framework frameworks model abstract

我正在使用Zend的一些模型抽象类。

  • Default_Model_Abstract:包含__set和__get以及每个值的setter和getter,并作为虚拟对象。
  • Default_Model_AbstractMapper:包含save(),find(),fetchall()等方法。

我几个月前在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的常用方法。

祝你好运, 尼科

1 个答案:

答案 0 :(得分:1)

我想不出任何其他方式来做这个逻辑方面。如果您发现这个过于冗长,可以将if/else转换为三元运算符表达式。这将使它成为一个单行。

$this->_id = ($value !== NULL) ? (int) $value : NULL;
return $this;

另一种选择是将您的if/else移至Zend_Filter之类的自定义NullOrInt。这可以在您需要此检查的任何地方重复使用,例如在控制器级别验证请求输入或在Zend_Form或您的Setter等中