2010-12-09 75 views
1

我使用Zend的一些模型抽象类。Zend Framework的模型抽象和空值

  • 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,'Choose your option'))。但是这会给我一个错误,因为一个空字符串不是一个有效的外键id既不是null也是允许的。

我的第一个尝试是检查我的控制器处理表单,如果select元素值是一个emptry字符串并将其更改为null。这很丑陋,问题在于,我的setter将null更改为0,因为我使用(int)$ value对其进行了验证。

public function setId($value) 
{ 
    $this->_id = (int) $value; 
    return $this; 
} 

所以另一种方法是,我查一下我的二传手,如果该值为空,然后我不(INT)验证它。那看起来就像那样。

public function setId($value) 
{ 
    if($value !== null) 
     $this->_id = (int) $value; 
    return $this; 
} 

这会工作FR这种情况下,但我没有任何意义,因为有时我想这样重置现有的值设置为null。所以我不能在setter中忽略null值。所以另一种方法是:

public function setId($value) 
{ 
    if($value !== null) 
     $this->_id = (int) $value; 
    else 
     $this->_id = null; 
    return $this; 
} 

但现在它真的很难看。我很好奇看到你们如何解决这个问题。因为我认为必须有一个简单的解决方案,而不需要在setter中移除(int)。因为据我所见,这似乎是使用setter的常用方法。

最好的问候, 尼科

+0

这不是你的__set或__get问题的答案,但你可以在控制器中验证if(trim($ yourselect)== '')$ yourselect = null; ? – Ashley 2010-12-09 09:43:16

回答

1

我想不出任何其他方式做到这一点逻辑,明智的。如果你觉得这太冗长了,你可以把if/else变成一个三元运算符表达式。这将使它成为一线。

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

另一种选择是你的if/else进入自定义Zend_FilterNullOrInt。这可以在需要此检查的任何地方重新使用,例如在控制器级别验证请求输入或在Zend_Form或在您的二传手等

+1

这是一个很好的解决方案,谢谢戈登。我将使用一个验证器,这样我就可以将所有的“智能”留给表单,并且不必再关注控制器或模型。 – Nico 2010-12-09 22:00:11