Я не уверен, что название - лучший способ описать этот вопрос.
Эта книга - http://apress.com/book/view/9781590599099 - иллюстрирует реализацию шаблона «Единица работы». Это выглядит примерно так.
class UoW(){
private array $dirty;
private array $clean;
private array $new;
private array $delete;
public static function markClean(Entity_Class $Object){
//remove the class from any of the other arrays, add it to the clean array
}
public static function markDirty(Entity_Class $Object){
//remove the class from any of the other arrays, add it to the dirty array
}
public static function markNew(Entity_Class $Object){
//add blank entity classes to the new array
}
public static function markDelete(Entity_Class $Object){
//remove the class reference from other arrays, mark for deletion
}
public function commit(){
//perform all queued operations, move all objects into new array, remove any deleted objects
}
}
class MyMapper(){
public function setName($value){
$this->name = $value;
UoW::markDirty($this);//here's where the problem is
}
}
(на мгновение игнорируя проблемы статических вызовов и зависимостей)
Автор отмечает, что эта реализация требует, чтобы кодер вставил соответствующие методы маркировки UoW, и что это выборное соблюдение шаблона может привести к ошибкам. Теперь, взглянув на плюсы и минусы конкретных аксессоров, вы, возможно, можете автоматизировать UoW-вызов следующим образом:
public function __set($key,$value){
//check to see if this is valid property for this class
//assuming the class has an array defining allowed properties
if(property_exists($this,$key)){
$this->$key = $value;
UoW::markDirty($this);
/*
* or alternatively use an observer relationship
* i.e. $this->notify();
* assuming the UoW has been attached prior to this operation
*/
}
}
Итак, мой вопрос: как бы вы гарантировали, что соответствующий метод UoW был вызван при установке свойств для объекта домена?