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

Обсуждение