Я не уверен, что название - лучший способ описать этот вопрос.Единица работы шаблона, геттеры, сеттеры и контракты (PHP)
Эта книга - 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 был вызван при установке свойства объекта домена?
* Единица работы * и другие шаблоны подробно описаны в [* Образцы архитектуры корпоративных приложений * Мартин Фаулер] (http://martinfowler.com/eaaCatalog/index.html). [Вы можете прочитать отрывки из него (включая соответствующие страницы UoW) в Google Книгах.] (Http://books.google.de/books?id=FyWZt5DdvFkC&lpg=PT213&ots=eEDx-vWx6E&dq=%22with%20object%20registration%20 (Рисунок% 2011.2)% 22 & pg = PT211 # v = onepage & q =% 22w%% 20object% 20registration% 20 (Рисунок% 2011.2)% 22 & f = false) Фаулер упоминает * Регистрация объекта *, * Регистрация вызывающего абонента * и * UoWController * как возможные подходы , – Gordon
У меня есть книга прямо здесь, на моем столе, но ни один из методов «автоматизировать» регистрацию или уведомление. Регистрация объекта и вызывающего абонента исключает необходимость отмечать изменения данных в объекте, но требует, чтобы все изменения в модели выполнялись самим UoW в commit(). – sunwukung
ну, он упоминает АОП, но это, по общему признанию, едва ли возможно для PHP. Модели наблюдателей звучат хорошо для меня. – Gordon