PHP Шаблон репозитория - обновление функциональности - PullRequest
1 голос
/ 10 марта 2020

Я работаю над написанием метода обновления, в основном

class Entity {
 public $a;
 public $b;
}

class EnitityRepository {
 public function update(int $id, Entity $entity){
   $this->dao->update($id, $entity);
 }

 public function get(int $id){
   //does a look-up and returns an object of Entity
 }
}

class Dao {
  public function update(int $id, Entity $entity){
    $sql = "Update ABC";
    if(isset($entity->a) {
      $sql .= "set a = :a";
    }
    if(isset($entity->b) {
      $sql .= ", set b = :b";
    }
    $sql .= " WHERE id = :id";
  }
}

Теперь, в моем дао, я хочу обновить запись, когда нет возможности записать условное обновление (обновлять только те значения, которые быть установленным), поскольку вы не знаете, установлено ли свойство объекта или нет ... и вы не можете просто полагаться на empty или проверять ноль, как если бы вы действительно хотели установить значение как ноль.

Было бы анти-паттерном использовать маги c метод __get, __set, __isset для рефакторинга класса Entity следующим образом?

class Entity {
  private $data = [];

  private $properties = [
      'a'      => true,
      'b'      => true,
  ];

  public function __set($name, $value) {
    if (array_key_exists($name, $this->properties)) {
      $this->data[$name] = $value;
    } else {
      //throw exception
    }
  }

  public function __get($name) {
    if (array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }

    return null;
  }

  public function __isset($name) {
    return isset($this->data[$name]);
  }

  public function __unset($name) {
    unset($this->data[$name]);
  }
}

Или есть ли лучший способ, чем передать массив вместо объекта в Дао.

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