Veri Mapper model ve yinelenen nesneleri

3 Cevap php

Ben geliştiriyorum bir PHP uygulaması veri Eşleştiricisi desen kullanarak ve bir sorum var ediyorum. Şu anda, belirli bir kimliği ile bir Site nesnesi talep ve mapper, satır arama bir nesne oluşturmak ve dönecektir. Eğer aynı site için tekrar yaparsanız Ancak, aynı veriler ile iki farklı nesneler ile sonuna kadar. örn.:

$mapper = new Site_Mapper();
$a = $mapper->get(1);
$b = $mapper->get(1);

$a == $b // true
$a === $b // false

Yani, benim soru, gerektiği olduğunu:

  1. Store instantiated Site objects in the mapper so I can then check if they already exist before creating a new one (could be a problem if there's multiple mappers of the same type)
  2. Do the same as #1 but ensure there is only ever one instances of each mapper
  3. Do the same as #1 but use a static property so multiple instances isn't a problem
  4. Don't worry about it because it's probably not a problem

3 Cevap

Ben bir şekilde önbelleğe alma ile gitmek istiyorum - statik mapper sınıfları benim ilk tercihi olmak, ve ben çoğunu gördüm ne olurdu. Aksi takdirde, seçenek 2 (singleton deseni olan) muhtemelen en iyi seçenektir.

Eğer bir güncelleme eski veriler döndürülmesini engellemek için yapıldığında bu önbelleği temizlemek gerekir hatırlıyorum.

Eğer bir kullanım sürü veya almak için bir şeyler yapıyoruz sürece, bu sorguları çok önemli olmayabilir etmez, o söyledikten sonra. (Sizin 4)

Ayrıca rehberlik bakarak değer (Ben pek çok örnek vardır eminim, ben sadece biliyorum bu iyi), uskur (http://propel.phpdb.org/) önbelleğe alma özelliği vardır - nasıl bunu yapar bakarak değer olabilir? Ya da belki de kullanabilir?

Ne aradığınız Identity Map modelidir. Olsa da, sözde "okuma tutarsızlıklar" dikkatli olun. Eğer bir "eski örneği" kullanırken, DB çoktan değişmiş olabilir. Ve size bir nesneyi düzenlemek ederken, başka bir kullanıcı, bunun bir örneğini almak daha hızlı değiştirmek ve daha hızlı kurtarabilir. Sonra diğer nesne yine tüm bu değişiklikleri geçersiz kılar. Web üzerinde değil belki böyle büyük bir sorun olsa bir "sayfa" çabuk geçiyor beri hiçbir nesne birkaç kesirli saniye daha uzun süre hayatta.

Ben soru başkası benzer bir ikilem içinde çalışıyorsa uzunca bir süre önce yine sadece durumda cevap vermek istedim istendi biliyorum. Aslında yukarıdaki önerileri # 1,2,3 yapılan yazarın tüm ilişkili olduğunu ve bir sorunu çözmek için hepsini düşünmelisiniz.

Eğer aynı kimliği ile nesne istendiğinde tekrar yapmak zorunda kalmamak 1) bir eşleştiricisindeki DB nesne alınan her saklayın. Sonraki tüm aramalar mapper saklanan nesneyi döndürmek gerekir. Bu IdentityMap desen denir. Bu, belirli bir nesne türü için bir IdentityMap bir örneğini tutmak için eşleştiricisindeki özel mülkiyet yapmak elde etmek. Nesne mapper veritabanına gidecek henüz alınır değil, Site_Mapper-> get () yöntemi her zaman belirli bir kimliği IdentityMap kontrol etmelisiniz ama zaten haritada depolanan eğer yolculuk kaydeder önbelleğe örneğini döndürür veritabanı. Öyleyse onlar aynı nesne örneği için başvurular olurdu çünkü === $ b true olmalıdır $.

2) Evet ideal olarak, her zaman belirli bir zamanda IdentityMap tek bir örneğini muhafaza edilmesi amacıyla belirli bir veri eşleştiricisi (Site_Mapper) bir örneği olmalıdır. Bu Singleton desen kullanılarak yapılabilir. Bu Site_Mapper::getInstance() ki her zaman belirli bir eşleyiciye aynı örneği döndürür gibi bir gaz giderici yöntemiyle mümkündür. Ayrıca new kullanılarak istenmeyen Destekleme önlemek ve emin getInstance() bir eşleyicisini örneğini tek yolu yapmak için özel bir yöntem olarak __construct() beyan etmek zorundasınız.

3) ne yazar statik özellikleri hakkında yukarıda belirtildiği de geçerlidir. PHP birinde bir Singleton uygulamak için bir Mapper statik tutmak için mal ve örneği kullanmak zorundadır.

Ben çok Martin Fowler kitabı yukarıda belirtilen desenleri ve daha birçok bahsediyor "Enterprise Application Architecture Modelleri" öneriyoruz. Bu sizin kendi özel ORM çözüm üzerinde çalışıyorsanız özellikle salt bir iyi. Umut olur.