Veri Eşleştiricisi genellikle neye benziyor?

5 Cevap php

I Cat adlı bir tablo, ve Cat adında bir PHP sınıfı var. Şimdi, bir CatDataMapper sınıf yapmak istiyorum o kadar Cat extends CatDataMapper.

Ben Veri Mapper sınıf ORM yapmak için temel işlevsellik sağlamak ve Cat, yaratma, düzenleme ve silme etmek istiyorum.

Bu amaçla, belki de çok iyi bu desen bilen birisi bana yardımcı olabilecek bazı öneriler verebilir? Ben),) sadece güncelleme (gibi bazı fonksiyonları sağlamak için biraz fazla basit olabilir (silme), (tasarruf edeceğini hissediyorum.

I realize a Data Mapper has this problem: First you create the instance of Cat, then initialize all the variables like name, furColor, eyeColor, purrSound, meowSound, attendants, etc.. and after everything is set up, you call the save() function which is inherited from CatDataMapper. This was simple ;) But now, the real problem: You query the database for cats and get back a plain boring result set with lots of cats data.

PDO Kedi örneklerini oluşturmak için bazı ORM yeteneğine sahiptir. Ben ya da ben bir ilişkisel dizi alır mapDataset () fonksiyonu var diyelim, bu kullanımı söylemek sağlar. Ancak, kısa sürede bir veri setinden benim kedi nesne var gibi, ben gereksiz veri var. Aynı zamanda, yirmi kullanıcılar, veritabanından aynı kedi verileri almak ve kedi nesnesini düzenlemek, yani kedi yeniden adlandırın ve () onu kurtarabilecek başka furColor ayarlama hakkında başka bir kullanıcı Hala şeyler yaparken. Hepsi kendi düzenlemeleri kaydetmek, her şey berbat.

Err ... ok, gerçekten kısa bu soruyu tutmak için: iyi bir uygulama ne burada?

5 Cevap

Dan DataMapper in PoEA

The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. With Data Mapper the in-memory objects needn't know even that there's a database present; they need no SQL interface code, and certainly no knowledge of the database schema. (The database schema is always ignorant of the objects that use it.) Since it's a form of Mapper (473), Data Mapper itself is even unknown to the domain layer.

O bir olan-bir ilişki oluşturmak ve Kalıcılık tabakasına Kedi kravat çünkü Böylece, Kedi CatDataMapper genişletmek gerekir. Eğer bu şekilde Kediler sebat idare edebilmek istiyorsanız, ActiveRecord veya diğer veri kaynağı Mimari Desenler herhangi içine bakmak.

Alan Modeli kullanırken genellikle DataMapper kullanın. Basit bir DataMapper sadece bir alan-to-alan bazında eşdeğer bir bellek sınıf bir veritabanı tablosunu eşlersiniz. Bir DataMapper için ihtiyaç duyulduğunda Ancak, genellikle bu tür basit ilişkileri olmaz. Tablolar, nesnelere 01:01 haritasına olmayacaktır. Bunun yerine birden fazla tablo bir nesne Agrega ve tam tersi içine oluşturabilir. Sonuç olarak, just CRUD yöntemleri, kolayca oldukça bir sorun haline gelebilir uygulanması.

Bunun dışında, genellikle, diğerleri arasında Repository pattern ile kombinasyon halinde kullanılan daha karmaşık bir desen (POEA 15. sayfaları kapsayan) 'dir. Benzer sorular için bu sayfanın sağ tarafındaki ilgili sorular sütuna bakın.

Aynı Kedi düzenleme birden çok kullanıcı hakkında Sorunuza gelince, o denilen ortak bir sorun Concurrency. Birisi düzenlemeleri ederken, locking the row olacak bir çözüm. Ama her şey gibi, bu olabilir lead to other issues.

Veri Eşleştiricisi'ni uygulanmasında PHP <çok zor 5,3, sen okuyamaz beri / / korumalı özel alanları yazın. Yükleme ve nesneleri kaydederken birkaç seçenek var:

  1. , Nesne seri string gösterimi var, değiştirme ve unserialize ile geri getirmek gibi, geçici çözüm çeşit kullanın
  2. Tüm alanları kamu olun
  3. Özel / korumalı tutun, ve bunların her biri için mutators / erişimcilerini yazmak

İlk yöntem, yeni bir sürümü ile kırma olasılığı vardır ve çok ham kesmek, ikinci bir (çok) kötü bir uygulama olarak kabul edilir.

The third option is also considered bad practice, since you should not provide getters/setters for all of your fields, only the ones that need it. Your model gets "damaged" from a pure DDD (domain driven design) perspective, since it contains methods that are only needed because of the persistence mechanism. It also means that now you have to describe another mapping for the fields -> setter methods, next to the fields -> table columns.

PHP 5.3 yansıma kullanılarak, tüm alanların türlerini değiştirmek / erişim olanağı sunar:

http://hu2.php.net/manual/en/reflectionproperty.setaccessible.php

Tüm alanların mutators sağlamak için ihtiyaç olmaktan çıkmıştır, çünkü bu ile, gerçek bir veri eşleştiricisini elde edebilirsiniz.

Eğer Doctrine veya Propel gibi ORM yıllardan güveniyor, temel ilke, veritabanından gerçek veri alacağı bir statik sınıf, (örneğin uskur CatPeer yaratacak) oluşturmak için ve Akran sınıf tarafından alınan sonuçlar daha sonra Cat nesnelerin içine "sulu" olacaktır.

Hidrasyon işlemi alıcı ve ayarlayıcıları sahip güzel nesneler içine ayarlanmış bir "düz sıkıcı" MySQL sonucu dönüştürme sürecidir.

So for a retrieve you'd use something like CatPeer::doSelect(). Then for a new object you'd first instantiate it (or retrieve and instance from the DB): $cat = new Cat();

Ekleme yapıyor gibi basit olacaktır: $cat->save(); Bu bir insert (veya nesne zaten db varsa, bir güncelleme eşdeğer olurdu ... ORM yeni arasındaki farkı nasıl bilmeli ve örneğin, kullanarak nesneleri, mevcut varlığı) bir birincil anahtarın yokluğunu ort.

PDO features some ORM capability to create Cat instances. Lets say I use that, or lets even say I have a mapDataset() function that takes an associative array. However, as soon as I got my Cat object from a data set, I have redundant data. At the same time, twenty users could pick up the same cat data from the database and edit the cat object, i.e. rename the cat, and save() it, while another user still things about setting another furColor. When all of them save their edits, everything is messed up.

Genellikle verilerin devletin takip etmek ve IdentityMap ve / veya UnitOfWork tutmak eşlenen varlıklar üzerinde tüm teh farklı işlemleri takip ... ve isteği döngüsü al işlemlerinin ardından gerçekleştirilir olacağını sonunu kullanılacak sırayla.

keep the answer short: You have an instance of Cat. (Maybe it extends CatDbMapper, or Cat3rdpartycatstoreMapper) You call:

$cats = $cat_model->getBlueEyedCats();
//then you get an array of Cat objects, in the $cats array

Ne kullanıyorsunuz bilmiyorum, siz daha iyi anlaşılması için bazı php çerçevesinde bakmak olabilir.