Я не хочу, чтобы кто-то говорил: "Вы не должны изобретать велосипед, использовать ORM с открытым исходным кодом"; У меня есть неотложное требование и не могу переключиться.
Я делаю немного ORM, который поддерживает кеширование. Даже не поддерживая кеширование, мне нужна эта функция в любом случае, чтобы знать, когда писать объект на хранение или нет. Шаблон - DataMapper.
Вот мой подход:
- Я хочу избежать интроспекции времени выполнения (т.е. атрибутов угадывания).
- Я не хочу использовать генератор кода CLI для генерации getters и seters (действительно, я использую NetBeans один, используя ALT + INSERT).
- Я хочу, чтобы модель была самой близкой к POPO (простой старый объект PHP). Я имею в виду: частные атрибуты, "жестко закодированные" геттеры и сеттеры для каждого атрибута.
У меня есть класс Abstract, называемый AbstractModel
, который наследуют все модели. Он имеет открытый метод isDirty()
с приватным (может быть защищен, если необходимо) атрибутом is_dirty. Он должен возвращать true или false в зависимости от изменения данных объекта или нет с момента его загрузки.
Проблема заключается в следующем: есть способ поднять внутренний флаг "is_dirty"
без кодирования в каждом сеттере $this->is_dirty = true
? Я имею в виду: я хочу, чтобы сеттеры были $this->attr = $value
большую часть времени, за исключением необходимости изменения кода для бизнес-логики.
Другим ограничением является то, что я не могу полагаться на __set
, потому что в конкретном классе модели атрибуты уже существуют как частные, поэтому __set
никогда не вызывается в сеттерах.
Любые идеи? Приводятся примеры кода из других ORM.
Одна из моих идей заключалась в том, чтобы изменить шаблон сеттеров NetBeans, но я думаю, что должен быть способ сделать это, не полагаясь на среду IDE.
Еще одна моя мысль заключалась в создании сеттеров, а затем изменении имени частного атрибута с подчеркиванием или чем-то еще. Таким образом, сеттер будет звонить на __set
и иметь некоторый код для работы с флагом "is_dirty"
, но это немного нарушает концепцию POPO, и это уродливо.