0

我将使用一个抽象(简单)的示例来说明问题: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可能不是列的有效值。

所以,我的问题是:我们如何验证域对象中的每个数据片段是否已准备好插入数据库?我看到它的方式有几个选项:

  1. 如果我们对成员变量使用默认值(0对于 int、''对于 varchar 等),那么isDirty()会变得更加复杂,因为空值检查是不够的。但是,检查是否能够插入数据变得微不足道,因为可以毫无问题地插入默认值

  2. 如果我们坚持使用NULL默认值,那么isDirty()保持相当简单,但确保数据为数据库做好准备变得复杂。

  3. 单独验证每个变量,这取决于 DO 会很快变得丑陋。

  4. 在 MySQL 中使用默认值 - 对我来说不是一个真正的选项,但通常是一个有效的选项

4

1 回答 1

0

我感觉你参加了这篇文章的一部分,但误解了问题,在那里解决了。

您似乎正在尝试确定模型是否有效,然后再保存。但是你的结构有缺陷:

  1. 如果您使用单个 setter,那么当您尝试添加越来越多的条件时,此 setter 将变得越来越复杂。此外,通过避免为每个参数设置单独的设置器,您失去了实际验证参数的能力。

    当您为域对象设置无效值时,它应该创建内部错误状态。

  2. 您的验证假定所有值都必须不为空。如果他们可以NULL呢?如果值符合业务规则,而不是数据库设置的约束,则参数验证应检查。

  3. 当 mapper 试图在数据库中存储无效值时,会导致错误。如果您使用正确设置的 PDO 实例,它将引发异常。你如何处理那个异常,那是你的选择。域对象不负责数据库中的数据完整性。

于 2012-08-16T20:41:40.277 回答