我使用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的常用方法。
最好的问候, 尼科
这不是你的__set或__get问题的答案,但你可以在控制器中验证if(trim($ yourselect)== '')$ yourselect = null; ? – Ashley 2010-12-09 09:43:16