Düzgün Sınıf Yöntemi Doğru Kullanımı zorla nasıl?

2 Cevap php

Bizim şimdiki ORM çözüm ardından Model nesneler olarak alınan kayıtların arasında yineleme için kullanılan bir koleksiyon nesnesi döndürmek veritabanındaki tablolar / görüşlerini temsil Veri Mappers kullanır. Veri Mapper ve modeli katmanları arasındaki veri mappers etki alanı istekleri işler ve gelen koleksiyonları veya etki alanı nesneleri döndürür Repository tabakadır.

Şu anda veri Mapper katmana tüm uygulama istekleri depoyu üzerinden yönlendirilen ve Veri Mapper sonra gerekli koleksiyonunu döndürür depoyu için alınan veri satırlarını döndürür böylece Deposu ve Veri Mapper katmanların sorumluluklarını üstlenmeden bakıyor nesneyi talep.

Ne ben merak ediyorum biz sadece Deposu katmanı üzerinden veri Mappers erişimi zorlamak böylece gelen Veri Eşleyicisi'ndeki içine tüm Deposu nesnesi geçirmek için geçerlidir / iyi bir uygulama olup olmadığıdır.

Örnek olarak bu Şimdi nasıl çalıştığını temelde:

class DataMapper {

 public function findAll(Criteria $criteria) 
 {
  $select = $criteria->getSelect();

  // Build specific select statement

  $rows = $this->_fetchAll($select);

  return new Collection(array('data' => $rows, 'mapper' => get_class($this)));
 }
}

Ben böyle bir şey yapmayı düşünüyorum:

class Repository {

 public function findAllByName(Model $model)
 {
  $this->_criteria->addCondition('name LIKE ?', $model->name);

  $rows = $this->_mapper->findAll($this);

  return new Collection(array('data' => $rows, 'repository' => get_class($this)));
 }

} 

class DataMapper {

 public function findAll(Repository $repository) 
 {
  $select = $repository->getCriteria()->getSelect();

  // Build specific select statement

  $rows = $this->_fetchAll($select);

  return $rows;
 }
}

Ve sonra bu sürümde, Koleksiyon nesnesi ilk olarak önbelleğe alınan nesneleri arama ve daha sonra sadece gerekirse kayıt yüklemek için veritabanına bir arama sorunu olabilir depoyu bir çağrı sorunu olacaktır.

2 Cevap

Chris geçerli bir önerisi var.

Bu kısmen kod bağlamında bağlıdır, ancak oluşturmak DataMapper örneklerini içine depo enjekte bağımlılık, yani:

$repo = new Repository();

$mapper = new DataMapper($repo);

Daha sonra size findAll () kullanmak istediğinizde etrafında o $ repo geçmek zorunda sizi kaçınmayacağız. IE:

$mapper->findAll();
$mapper->findAllByName();

Parametreler ben yapıyorum her işlev çağrısının bir yerde parçası haline ne zaman buluyorum, o (onlar her zaman aynılar özellikle) örnek değişkenleri dönüştürerek düşünmek mantıklı.

Sizin depo bağlam / örnekleri arasında değişir o zaman enjeksiyon daha mantıklı. Eğer her zaman bir repo örneğini oluşturuyor ve geri dönüşüm istiyorum bulursanız, bir tek uygun olabilir.

Dependency Injection hakkında güzel bir şey bu bağımlılık fikri (ironic!) açıklık yapmasıdır. Eğer onu zorlamak istiyorsanız, size __ yapı () yöntemi, bir Deposu örneği $ repo nesne null ise bir istisna, ya da değil gibi bir şey yapabilirsiniz.

Ben belki biraz farklı bu yapardı. Ben bir setRepository (Repository $ repo) yöntemi yanı sıra getRepository () yöntemini eklersiniz. Sonra, findAll yönteminde,) (getRepository diyoruz. SetRepository () henüz denilen değilse, o zaman getRepository varsayılan depo örneğini dönebilirsiniz.

Depoyu'nın farklı uygulamaları DataMapper sınıf içinde kullanılabilir böylece ben de belki Deposu sınıfı için bir arayüz oluşturmak istiyorum.

Yani get yöntemi gibi görünebilir

public function getRepository()
{
    if (!$this->_repository) {
        $this->_repository = new Repository();
    }

    return $this->_repository;
}

ve set yöntemi gibi görünebilir

public function setRepository(RepositoryInterface $repos)
{
    $this->_repository = $repos;
}