【问题标题】:How to validate domain object data before database operations?如何在数据库操作之前验证域对象数据?
【发布时间】: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 .但是,检查数据是否能够插入变得微不足道,因为可以毫无问题地插入默认值
  1. 如果我们坚持使用NULL 作为默认值,那么isDirty() 仍然相当简单,但确保数据为数据库做好准备就变得复杂了。

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

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

【问题讨论】:

    标签: php model-view-controller domain-object


    【解决方案1】:

    我感觉你拿了this post的部分内容,但误解了问题,在那里解决了。

    您似乎试图在模型被保存之前确定模型是否有效。但是你的结构有缺陷:

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

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

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

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

    【讨论】:

    • 我明白你的意思,但很难找到比“验证”更好的词了。问题是我的映射器为每个数据库列显式设置值,这基本上需要某种默认值,无论是NULL''0 等。我本质上并不是“验证” DO 的数据,而是设置默认值。但是,自 OP 以来,我对代码进行了一些更改,以便映射器不依赖于 DO 的显式结构,而仅依赖于传入 DO 时设置的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2018-01-07
    • 2017-06-05
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多