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は、列の有効な値ではない可能性があります。

そこで、私の質問は、ドメイン オブジェクト内の各データが DB 挿入の準備ができていることをどのように検証できるでしょうか? 私の見方では、いくつかのオプションがあります。

  1. 0メンバー変数 ( int、''varchar など) にデフォルト値を使用するisDirty()と、null チェックでは不十分なため、より複雑になります。ただし、デフォルト値は問題なく挿入できるため、データを挿入できることを確認するのは簡単です。

  2. NULLデフォルト値のままにしておくisDirty()と、かなり簡単なままになりますが、DB 用のデータの準備が整っていることを確認するのは複雑になります。

  3. 各変数を個別に検証します。これは、DO によってはすぐに見苦しくなります。

  4. MySQL 内でデフォルト値を使用する - 私にとっては実際にはオプションではありませんが、一般的には有効なオプションです

4

1 に答える 1

0

あなたはこの投稿の一部を取ったような気がしますが、問題を誤解していましたが、そこで解決されました。

モデルが保存される前に、モデルが有効かどうかを判断しようとしているようです。しかし、あなたの構造には欠陥があります:

  1. 単一のセッターを使用している場合、条件を追加しようとすると、このセッターは複雑になります。また、パラメーターごとに個別のセッターを回避することで、パラメーターを実際に検証する機能が失われます。

    ドメイン オブジェクトに無効な値を設定すると、内部エラー状態が発生するはずです。

  2. 検証では、すべての値が非 null である必要があると想定しています。彼らができるとしNULLたら?パラメーターの検証では、値がデータベースによって設定された制約ではなく、ビジネス ルールに一致するかどうかを確認する必要があります。

  3. マッパーが無効な値をデータベースに保存しようとすると、エラーが発生します。適切に設定された PDO インスタンスを使用している場合、例外が発生します。その例外をどのように処理するかは、あなたの選択です。ドメイン オブジェクトは、データベース内のデータの整合性について責任を負いません。

于 2012-08-16T20:41:40.277 に答える