注意!
この件についての私の意見は、先月少し変わった。答えはまだ有効ですが、大きなオブジェクトグラフを扱う場合は、代わりに作業単位パターンを使用することをお勧めします。あなたはこの答えでそれの簡単な説明を見つけることができます
what-you-call-ModelがORMとどのように関連しているか混乱しています。ちょっと紛らわしいです。特にMVCではモデルはレイヤーであるため(少なくとも、私はそれを理解しています。あなたの「モデル」はドメインオブジェクトに似ているようです )。
私はあなたが持っているものが次のようなコードであると仮定します:
$model = new SomeModel;
$mapper = $ormFactory->build('something');
$model->setId( 1337 );
$mapper->pull( $model );
$model->setPayload('cogito ergo sum');
$mapper->push( $model );
そして、 what-you-call-Modelには、データマッパーで使用されるデザイナーという2つのメソッドがあるgetParameters()
と仮定しますsetParameters()
。そして、マッパーがwhat-you-call-Modelの状態をisDirty()
保存して呼び出す前に、マッパーがデータをwhat-you-call-Modelにプルするときに呼び出すこと。cleanState()
setParameters()
ところで、との代わりにデータマッパーとの間で値を取得するためのより良い提案がある場合は、getParameters()
共有してください。私はより良いものを考え出すのに苦労しているからです。これはカプセル化リークのように私には思えます。
これにより、データマッパーメソッドは次のようになります。
public function pull( Parametrized $object )
{
if ( !$object->isDirty() )
{
// there were NO conditions set on clean object
// or the values have not changed since last pull
return false; // or maybe throw exception
}
$data = // do stuff which read information from storage
$object->setParameters( $data );
$object->cleanState();
return $true; // or leave out ,if alternative as exception
}
public static function push( Parametrized $object )
{
if ( !$object->isDirty() )
{
// there is nothing to save, go away
return false; // or maybe throw exception
}
$data = $object->getParameters();
// save values in storage
$object->cleanState();
return $true; // or leave out ,if alternative as exception
}
コードスニペットParametrized
には、どのオブジェクトを実装する必要があるインターフェイスの名前があります。この場合、メソッドgetParameters()
とsetParameters()
。そして、それはそのような奇妙な名前を持っています。なぜなら、OOPでは、implements
単語はhas-abilities-ofを意味し、extends
手段は-aであるからです。
この部分まで、あなたはすでにすべてが似ているはずです...
ここで、isDirty()
andcleanState()
メソッドが実行する必要があることを次に示します。
public function cleanState()
{
$this->is_dirty = false;
$temp = get_object_vars($this);
unset( $temp['variableChecksum'] );
// checksum should not be part of itself
$this->variableChecksum = md5( serialize( $temp ) );
}
public function isDirty()
{
if ( $this->is_dirty === true )
{
return true;
}
$previous = $this->variableChecksum;
$temp = get_object_vars($this);
unset( $temp['variableChecksum'] );
// checksum should not be part of itself
$this->variableChecksum = md5( serialize( $temp ) );
return $previous !== $this->variableChecksum;
}