Der beste Weg, um mit einem verschmutzten Zustand in einem ORM-Modell umzugehen

Ich möchte nicht, dass jemand etwas sagt"Sie sollten das Rad nicht neu erfinden, sondern ein Open-Source-ORM verwenden"; Ich habe einen sofortigen Bedarf und kann nicht wechseln.

Ich mache ein bisschen ORM, das Caching unterstützt. Auch wenn Caching nicht unterstützt wird, würde ich diese Funktion sowieso benötigen, um zu wissen, wann ein Objekt in den Speicher geschrieben werden muss oder nicht. Das Muster ist DataMapper.

Hier ist mein Ansatz:

Ich möchte Laufzeit-Introspection vermeiden (d. H. Attribute erraten).Ich möchte keinen CLI-Codegenerator zum Generieren von Gettern und Setzern verwenden (im Grunde verwende ich NetBeans mit ALT + EINFÜGEN).Ich möchte, dass das Modell einem POPO (einfaches altes PHP-Objekt) am nächsten kommt. Ich meine: private Attribute, "hardcodierte" Getter und Setter für jedes Attribut.

Ich habe eine abstrakte Klasse namensAbstractModel dass alle Modelle erben. Es hat eine öffentliche Methode namensisDirty() mit einem privaten (kann bei Bedarf auch geschützt werden) Attribut namens is_dirty. Es muss true oder false zurückgeben, je nachdem, ob sich die Objektdaten seit dem Laden geändert haben oder nicht.

Das Problem ist: Gibt es eine Möglichkeit, die interne Flagge zu heben"is_dirty" ohne Codierung in jedem Setter$this->is_dirty = true? Ich meine: Ich möchte die Setter haben als$this->attr = $value In den meisten Fällen ist jedoch eine Codeänderung für die Geschäftslogik erforderlich.

Eine andere Einschränkung ist, dass ich mich nicht verlassen kann__set weil in der konkreten Modellklasse die Attribute bereits als privat existieren, also__set wird nie auf die Setter gerufen.

Irgendwelche Ideen? Codebeispiele aus anderen ORMs werden akzeptiert.

Eine meiner Ideen war es, die NetBeans-Setter-Vorlage zu ändern, aber ich denke, es sollte eine Möglichkeit geben, dies zu tun, ohne sich auf die IDE zu verlassen.

Ein anderer Gedanke, den ich hatte, war das Erstellen der Setter und dann das Ändern des Namens des privaten Attributs mit einem Unterstrich oder so. Auf diese Weise würde der Setter anrufen__set und habe dort einen Code, der sich mit dem befasst"is_dirty" flag, aber dies bricht das POPO-Konzept ein wenig und es ist hässlich.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage