Ответ 1
Attantion!
Мое мнение по этому вопросу несколько изменилось в прошлом месяце. Хотя ответ, который по-прежнему действителен, при работе с крупными объектными графами, я бы рекомендовал вместо этого использовать шаблон Unit-of-Work. Вы можете найти краткое объяснение этого в этом ansewer
Я немного смущен, как то, что вы называете-Model, связано с ORM. Это смущает. Тем более, что в MVC модель представляет собой слой (по крайней мере, то, как я его понимаю, и ваши "Модели" кажутся мне более похожими на Объекты домена).
Я предполагаю, что у вас есть код, который выглядит так:
$model = new SomeModel;
$mapper = $ormFactory->build('something');
$model->setId( 1337 );
$mapper->pull( $model );
$model->setPayload('cogito ergo sum');
$mapper->push( $model );
И, я буду предполагать, что у того, что вы вызывают-модель, есть два метода: конструктор, который будет использоваться картами данных: getParameters()
и setParameters()
. И что вы вызываете isDirty()
, прежде чем mapper сохранит состояние "вы-вызов-модель" и вызовите cleanState()
- когда транслятор переводит данные в модель "вы-вызов".
BTW, если у вас есть лучшее предложение для получения значений от-и-to-data mappers вместо
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
означает имеет-способности, аextends
означает is-a.. к югу >
До этой части у вас должно быть уже все похожее...
Теперь вот что должны делать методы isDirty()
и cleanState()
:
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;
}