【发布时间】:2012-08-13 04:43:48
【问题描述】:
我将使用一个抽象(简单)的例子来说明问题:CarDomainObject,如下:(示例mysql数据类型列在成员旁边)
class carDomainObject extends DomainObjectAbstract {
public $uid; //int
public $make; //varchar
public $model; //varchar
public $productionDate; //timestamp
public $doors; //tinyint
}
class DomainObjectAbstract {
public function setData(array $data=array())
{
foreach ($data as $key => $value)
{
if ( ! empty($key))
{
$this->$key = $value;
}
}
}
//if $val is not passed, checks for ANY set value,
// else checks that $this->$val is set (dirty)
public function isDirty($val=false)
{
foreach(get_object_vars($this) as $key => $property)
{
if( ! is_null($property) && ( ! $val || $key == $val))
{
return true;
}
}
return false;
}
}
假设我们要在数据库中插入一辆新车,所以我们设置一些值:
$carDomainObject->setData(array('make' => 'ford', 'model' => 'taurus'));
现在未设置的值仍将是NULL,这适用于isDirty() 方法。此架构不适用于将对象(已像上面那样初始化,仅具有某些值)插入数据库时,其中NULL 可能不是该列的有效值。
所以,我的问题是:我们如何验证域对象中的每个数据片段是否已准备好插入数据库?在我看来,有几个选择:
-
1234563 .但是,检查数据是否能够插入变得微不足道,因为可以毫无问题地插入默认值
如果我们坚持使用
NULL作为默认值,那么isDirty()仍然相当简单,但确保数据为数据库做好准备就变得复杂了。单独验证每个变量,这会很快变得丑陋,具体取决于 DO。
在 MySQL 中使用默认值 - 对我来说不是一个真正的选项,但一般来说是一个有效的选项
【问题讨论】:
标签: php model-view-controller domain-object