Шаблон работы, геттеры, сеттеры и контракты (PHP) - PullRequest
3 голосов
/ 05 июля 2010

Я не уверен, что название - лучший способ описать этот вопрос.

Эта книга - 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 был вызван при установке свойств для объекта домена?

1 Ответ

0 голосов
/ 25 июля 2013

Лучший подход, который я нашел, - объявить свойства «защищенными», а затем использовать комментарии PHPDoc, чтобы «выставить» их в качестве общедоступных свойств. Что-то вроде:

/**
 * @property string $prop
 */
class Foo extends UoW {
    protected $prop = "foo";

    public function __set($name, $value) {
        if (property_exists($this, $name)) {
            $this->$name = $value;
            $this->markDirty();
        }
    }
}

Это приведет к тому, что ваша IDE и большинство инструментов обнаружат, что Foo-> prop является свойством, при этом гарантируя, что грязная метка установлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...