====== lmbProxy-классы, используемые в ORM ====== В целях уменьшения overhead-а при использовании ORM, в Limb начиная с версии alpha3 введены 2 lmbProxy класса, используемых именно в рамках подсистемы ORM: * **lmbPersistentObjectProxy** * **lmbPersistentObjectProxyCollection** Оба этих класса наследуются от lmbProxy класса, который находится по пути LPKG_CORE_DIR/src/system/lmbProxy.class.php. Примеры использования lmbProxy-объектов можно увидеть на [[.data_mapper|странице про мапперы]]. Также мы рекомендуем прочитать описание [[lmbUnitOfWork]] о том, как транзакция работает с прокси-объектами. ===== lmbPersistentObjectProxy ===== **lmbPersistentObjectProxy** - прокси для единичного доменного объекта. Естественно, что этот класс реализует интерфейс **lmbPersistable**. Мапперы при загрузке доменного объекта для тех атрибутов, которые являются другими доменными объектами, не загружают их, а создают прокси-объект класса lmbPersistentObjectProxy. В этот прокси передается идентификатор и название класса маппера, который может загрузить реальный объект в случае необходимости. Главный вопрос, в каких случаях прокси-объект остается таким, а в каких случаях загружается реальный. Скажем сразу, что для клиентов процесс загрузки реального объекта остается прозрачным, то есть они не замечают, работают ли они с прокси-объектом или реальным. lmbPersistentObjectProxy заменяется реальным объектом во всех случаях когда происходит обращение к любым методам, кроме методом **getHash()** и **getId()**. Во всех остальных случаях происходит загрузка реального объкта. Однако этого достаточно для большинства случаев. ===== lmbPersistentObjectProxyCollection===== **lmbPersistentObjectProxyCollection** - прокси на коллекцию доменных объектов. Данный класс реализует интерфейс **lmbCollection**. Позволяет не загружать список доменных объектов, связанных с каким-либо другим отношением 1..N или N..M, а делать это только при реальной необходимости. **lmbPersistentObjectProxyCollection** принимает в констукторе $dao, который позволит загрузить данные по реальным объектам, $mapper, которых из этих данных сможет сделать реальные объекты и пустой доменный объект (некий эталон), которыми будет наполнена реальная коллекция. **lmbPersistentObjectProxyCollection** загружает реальные даннын при использовании любого метода из интерфейса итератора, а также при попытке добавления или удаления элементов из коллекции. lmbPersistentObjectProxyCollection возвращает пустой массив из метода **getRemovedItems()**, если прокси так и не был отрезолвлен. И еще, если прокси так и не был отрезолвлен, метод **isChanged()** будет возвращать false.