Ben yük veri mappers oluşan bir çıplak kemikleri ORM uygulama var ve varlıkları devam etmektedir. Aynı varlık sadece bir kez belleğe yüklenir, böylece her mapper içten, veritabanından okunan tüm varlıklar için bir kimlik haritası yönetir.
Şu anda varlık üzerinde bir özellik erişilen sadece ilgili verileri yükler bir proxy sınıfını kullanarak ilgili kişiler için tembel yükleme uygulamak duyuyorum. Benim sorunum proxy sınıfı (bir ilişki yoluyla) varlık kendisi değildir ve varlık dolaylı yüklü ise, yalnızca kullanılan olmasıdır. Yani aynı varlık yükleyen bir proxy ile gerçek varlık karşılaştırarak herhangi === onay false dönecektir. Amacım vekil nesnelerin habersiz varlıkları ve istemci kodu hem tutmaktır.
Proxy sınıfı gibi bir şey görünüyor:
class EntityProxy
{
protected $_entity;
protected $_loader;
public function __construct(EntityProxyLoader $loader)
{
$this->_loader = $loader;
}
protected function _load()
{
if (null === $this->_entity)
{
$this->_entity = $this->_loader->load();
unset($this->_loader);
}
}
public function __get($name)
{
$this->_load();
return $this->_entity->$name;
}
public function __set($name, $value)
{
$this->_load();
$this->_entity->$name = $value;
}
}
Ve mappers gibi görünmelidir:
class PersonEntityMapper
{
// Find by primary key
public function find($id)
{
if ($this->inIdentityMap($id)
{
return $this->loadFromIdentityMap($id);
}
$data = ...; // gets the data
$person = new Person($data);
// Proxy placeholder for a related entity. Assume the loader is
// supplied the information it needs in order to load the related
// entity.
$person->Address = new EntityProxy(new EntityProxyLoader(...));
$this->addToIdentityMap($id, $person);
return $person;
}
}
class AddressEntityMapper
{
// Find by primary key
public function find($id)
{
...
$address = new AddressEntity($data);
$address->Person = new EntityProxy(new EntityProxyLoader(...));
$this->addToIdentityMap($id, $address);
return $address;
}
}
Ben bir ilgili "AddressEntity" bir "PersonEntity" kaydı yüklerseniz, o zaman bir vekil gibi onlar (aynı olmayacak, "AddressEntityMapper" üzerinden doğrudan aynı "AddressEntity" kaydı yüklemek ve iki nesneleri karşılaştırmak delegeler .) PHP nesne karşılaştırıldığında inşa geçersiz kılmak için herhangi bir yolu var mı? Kuruluşlar ve / veya istemci koduna vekil farkında kod tanıtan olmadan bu işlemek için iyi bir yol üzerinde herhangi bir öneriniz?
Ayrıca, ben varolan ve kurulan ORM benimsemek benim yararına olacağını farkındayım, ama bunu yaparken beni engelleyen çeşitli sorunlar vardır.