Modeli kısmı için bir PHP tasarım deseni [PHP Zend Framework]

2 Cevap php

Ben Zend Framework kullanarak bir PHP MVC uygulama var. Hızlı başlangıç ​​sunulduğu gibi, ben modeli kısmı için 3 katmanları kullanın:

  • Modeli (iş mantığı)
  • Veri mapper
  • Tablo veri ağ geçidi (veya veri erişim nesnesi, SQL tablo başına yani bir sınıf)

Model UML tasarlanmış ve DB tamamen bağımsızdır.

My problem is: Ben aynı "örneği / kayıt" birden çok örneği olamaz.

For example: I id = 5 ile, örneğin, kullanıcı "Chuck Norris" olsun, bu yeni bir model örneği wich üyeleri veri Eşleştiricisi (veri ile dolu olacak yaratacak mapper) DB sorgulamak tablo veri ağ geçidi sorgulayabilirsiniz. Sonra, ben "Ördek Norras" adını değiştirirseniz, hemen DB tasarruf yok ve başka bir değişkende aynı kullanıcıyı yeniden yüklemek, ben "senkronizasyon" sorunları var ... ({[(2)] } ")

Singleton gibi, ama bir anahtar tarafından dizine birden çok örneği (wich bizim örneğimizde kullanıcı kimliği): Şu anda, ben Multiton / Identity Map desen kullanın. Ama bu da benim Developpement çok ve benim denemeleri ağırlaştırmaktadır.

How to do it right ?

2 Cevap

"Canlı model havuzunda" bütün yüklenmiş modeli örneklerini tutun. Yüklediğiniz zaman / zaten havuz (birincil anahtar veya benzeri bir kavram kullanmak) yüklü olması halinde ilk kontrol, bir modeli sorgulayabilir. Eğer öyleyse, havuzdan nesneyi (veya bir başvuru) döndürür. Bu şekilde, tüm başvuruları aynı nesneye işaret. Benim terminoloji yanlış olabilir ama umarım anladınız. Temelde havuz iş mantığı ve veritabanı arasında bir önbellek olarak görür.

Identity Map

Edit

In response to this comment:

Ben bir "X seçmek *" varsa, nasıl ben zaten yüklü kayıtları alma atlayabilirsiniz?

Sen sorguda kendisi olamaz, ancak varlık nesneleri içine satır yükler mantık olabilir. Pseudo-code:

class Person {}

class PersonMapper {
  protected $identity_map = array();
  function load($row) {
    if (!isset($this->identity_map[$row['id']])) {
      $person = new Person();
      foreach ($row as $key => $value) {
        $person->$key = $value;
      }
      $this->identity_map[$row['id']] = $person;
    }
    return $this->identity_map[$row['id']];
  }
}

class MappingIterator {
  function __construct($resultset, $mapper) {
    $this->resultset = $resultset;
    $this->mapper = $mapper;
  }
  function next() {
    $row = next($this->resultset);
    if ($row) {
      return $this->mapper->load($row);
    }
  }
}

Uygulamada, muhtemelen isterdin için MappingIterator Iterator uygulamak, ama kısalık için atlanır için.