Download the PHP package seredoff/evolve-orm without Composer
On this page you can find all versions of the php package seredoff/evolve-orm. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download seredoff/evolve-orm
More information about seredoff/evolve-orm
Files in seredoff/evolve-orm
Package evolve-orm
Short Description Адаптивное ORM для проектов с динамично развивающейся доменной моделью
License MIT
Homepage https://github.com/SeredOFF/EvolveORM
Informations about the package evolve-orm
EvolveORM
Адаптивное ORM для проектов с динамично развивающейся доменной моделью.
Содержание
- Введение
- Проблематика и обоснование
- Архитектура и принципы работы
- Установка и настройка
- Основные компоненты
- Примеры использования
- Продвинутые возможности
- Производительность и оптимизация
- Ограничения и совместимость
Введение
EvolveORM - PHP-библиотека, разработанная для эффективной работы с базами данных в проектах с быстро меняющимися и сложными доменными моделями. Она предлагает гибкий подход к объектно-реляционному отображению, преодолевая ограничения традиционных ORM-систем.
О паттерне гидрации
Процесс гидрации (насыщения) используется для наполнения данными уже доступной пользователю сущности. Когда был создан и зафиксирован ее инвариант в каком-либо перманентном хранилище данных. Поэтому следует учитывать, что гидрация производится полностью в обход интерфейса сущности (без вызова конструктора и сеттеров), предполагая изначальное соответствие неполной сущности инварианту своего типа.
Проблематика и обоснование
Эволюция проектов и проблемы с моделированием данных
Разработка программного обеспечения начинается с MVP (Minimum Viable Product), функциональные границы которого относительно определены. Это приводит к созданию простой и детерминированной структуры данных с прозрачными связями.
С преобразованием такой структуры данных в доменную модель большинство ORM-библиотек успешно справляются. Обеспечивая быстрое прототипирование и простоту поддержки начальной версии продукта.
Проблемы, возникающие при развитии проекта:
- Усложнение требований.
- Необходимость выполнения комплексных агрегирующих вычислений в БД.
- Трудности при проектировании и гидрации доменной модели из-за ограничений изначальной структуры данных.
Ограничения классических ORM
Традиционные ORM-библиотеки сталкиваются с рядом проблем при масштабировании проекта:
- Неэффективность при сопоставлении сложных свойств объектов и их связей
- Ограничения встроенных конструкторов запросов (Query Builders)
- Тенденция диктовать дизайн кода, что может привести к проблемам с гибкостью системы и моделированию
Архитектура и принципы работы
Ключевые особенности
EvolveORM предлагает альтернативный подход, основанный на следующих принципах:
- Самостоятельное составление запросов к БД: Отказ от конструкторов запросов ORM-библиотек в пользу прямого использования SQL. Позволит создавать сложные доменные модели независимо от структуры базы данных.
- Прозрачный маппинг: Прозрачный механизм маппинга свойств и связей объектов через алиасы на этапе составления SQL-запроса.
- Оптимизация производительности: Значительное ускорение работы за счет исключения промежуточных этапов конструирования запросов и маппинга, характерных для ORM-систем.
- Поддержка DDD: Облегчение реализации тактических паттернов предметно-ориентированного проектирования.
Схема работы EvolveORM
Установка и настройка
Для установки EvolveORM используйте Composer:
Основные компоненты
Hydrator
Отвечает за преобразование массивов данных в объекты. Он использует рефлексию для анализа свойств классов и их типов.
EvolveORM по-умолчанию включает следующие встроенные стратегии (в порядке применения):
- OrmMapperStrategy - позволяет применять пользовательские мапперы для гидрации свойств объекта, используя конфигурацию ORM или атрибуты.
- UnionStrategy - обрабатывает гидрацию свойств объекта, имеющих union тип, состоящий только из встроенных типов PHP ( int, float, string, bool, array). Ограничение обусловлено необходимостью присвоения данных как есть. Иначе возникает неопределенность при соотношении типов данных.
- BuiltInTypeStrategy - обрабатывает гидрацию свойств объекта, имеющих встроенные типы PHP (такие как int, string, bool и т.д.).
- EnumStrategy - обрабатывает гидрацию свойств объекта, имеющих тип Enum. Поддерживает как целочисленные, так и строковые значения для создания экземпляров Enum.
- InternalClassStrategy - обрабатывает гидрацию свойств объекта, имеющих тип внутреннего класса PHP, такие как DateTime, DateTimeImmutable и другие.
- CustomClassStrategy - обрабатывает гидрацию свойств объекта, имеющих тип пользовательского класса. Она использует рефлексию и гидратор для создания и заполнения объектов вложенных классов.
ORM Mappers
EvolveORM поддерживает возможность пользовательского объектно-реляционного отображения данных для обработки отдельных свойств объектов. Подробнее см. в конфигурации ORM мапперов.
Built-in мапперы:
- ToArrayMapper - для преобразования JSON-строки в ассоциативный массив.
- ToEntityCollectionMapper - для создания коллекции объектов указанного класса.
- ToNullableValueObjectMapper - для создания объекта-значения указанного класса, с возможностью возврата null при отсутствии данных.
Примеры использования
Базовое использование
Работа со сложными моделями
EvolveORM эффективно справляется с гидратацией сложных моделей, включающих множество вложенных объектов и коллекций. Рассмотрим пример модели, представляющей информацию о поездках автобусов.
Структура данных
Модель поездки включает следующие основные элементы:
- Идентификатор поездки
- Дата и время поездки
- Информация о маршруте
- Данные об автобусе
- Информация о водителе
- Список точек маршрута
- Список пассажиров с их багажом
Пример реализации модели
Конфигурация гидратора
Процесс гидратации
EvolveORM принимает на вход плоскую карту значений, где данные для гидратации объекта представлены в "расскатанном" виде.
Пример входных данных:
На выходе получаем объемную модель данных, где все вложенные объекты и коллекции правильно инициализированы и заполнены.
Подробную реализацию доменной модели и ее репозитория можно найти в директории tests.
Продвинутые возможности
Конфигурация ORM мапперов
Для обработки определенных свойств можно использовать пользовательские мапперы:
Добавьте маппер используя ORM конфигурацию или атрибуты:
Пользовательские стратегии гидрации
EvolveORM поддерживает использование пользовательских стратегий гидрации для адаптации под специфические требования проекта.
Для добавления пользовательских стратегий, создайте класс, реализующий интерфейс HydrationStrategy
:
При создании экземпляра гидратора, передайте массив пользовательских стратегий:
Примечания
- Порядок стратегий в массиве определяет порядок их применения.
- Сначала применяются пользовательские стратегии, затем встроенные.
- Свойство будет обработано первой подходящей стратегией.
Производительность и оптимизация
EvolveORM реализует ряд оптимизаций для повышения производительности:
Кэширование рефлексии
По умолчанию используется механизм кэширования на основе слабых ссылок (WeakRef):
- Автоматическое освобождение памяти при неиспользовании объектов
ReflectionClass
. - Снижение потребления памяти.
- Предотвращение утечек памяти.
- Разрешение проблем с циклическими ссылками.
Перманентное кэширование
Для дополнительной оптимизации предусмотрен интерфейс ReflectionCache
для реализации постоянного кэширования.
Пользователи могут реализовать этот интерфейс для создания собственных механизмов кэширования, например, с использованием Redis или файловой системы.
Инвалидация кэша
Для управления жизненным циклом кэша предусмотрен метод clear()
:
Рекомендуется вызывать этот метод при обновлении кода приложения или изменении структуры классов.
Сравнение производительности
Операция | Традиционное ORM | EvolveORM |
---|---|---|
Загрузка простого объекта | 100% | 95% |
Загрузка сложного объекта с вложенными коллекциями | 100% | 70% |
Загрузка коллекции объектов | 100% | 60% |
Примечание: меньшие значения означают лучшую производительность
Ограничения и совместимость
- Не поддерживает динамические свойства (не объявленные в классе).
- Строгая типизация свойств в классах.
- Версия PHP 8.2+.
All versions of evolve-orm with dependencies
ext-json Version *
ext-mbstring Version *