[1.14] [GORM] modellierungserweiterung

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 29.03.2011, 17:18:52

Habe noch etwas bei mir entdeckt, was ich nun anders lösen muss.

Ich habe die Attributes eines GDO immer als Zwischenspeicher genutzt, für Dinge, welche nicht in die Datenbank gespeichert werden bzw. nicht direkt im gleichen GDO gespeichert werden. Da das GDO nicht mehr vom APFObject erbt, sind natürlich auch keine Attributes mehr da, die ich als zwischenspeicher verwenden kann.

Ich habe zum Beispiel bei einem User das Eintrittsdatum und das Austrittsdatum, soewtas habe ich in einer Attribute Tabelle gespeichert um das User Object des UserManagement nicht direkt verändern zu müssen. Wenn ich nun die UserListe abfrage, dann habe ich bisher immer das Eintritts- bzw. Austrittsdatum per loadRelatedObject abgefragt und per setAttribute im User Object hinterlegt. Die gesamte Userliste habe ich dann gecachet. Dieses Vorgehen ist ja so nicht mehr möglich. Nun kann ich natürlich das generierte UserObject erweitern, aber ist das sinnvoll? Dann muss ich auch die __sleep Methode überschreiben, damit meine Zusatzangaben mit in den Cache geschrieben werden.

Irgendwelche Vorschläge?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 29.03.2011, 17:24:00

Einzige Möglichkeit, wie du schon sagst, dürfte sein: ein eigenes "User" Objekt anlegen, und dort die Methoden definieren, überschreiben von __sleep() sollte ja auch kein Problem sein eigentlich

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 29.03.2011, 17:40:47

Dann habe ich aber wieder das Problem, dass ich das User Object per import bekannt machen muss, da sonst wieder der Fehler mit dem nicht kompletten Objekt auftritt.
Aber da habe ich irgendwie gerade allgemein das Problem, dass nach dem Laden aus dem Cache keine Daten mehr im Objekt vorhanden ist -.-
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 29.03.2011, 17:42:46

Aber da habe ich irgendwie gerade allgemein das Problem, dass nach dem Laden aus dem Cache keine Daten mehr im Objekt vorhanden ist -.-
Inwiefern?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 29.03.2011, 17:50:28

Ein

Code: Alles auswählen

echo printObject($UserObject);
 
bringt nach dem holen aus dem Cache folgende Ausgabe
User Object
(
[Attributes:User:private] => Array
(
)

[dataComponent:GenericDomainObject:private] =>
[objectName:GenericDomainObject:private] =>
[properties:GenericDomainObject:private] => Array
(
)

[relatedObjects:GenericDomainObject:private] => Array
(
)

[objectName] =>
[properties] =>
[relatedObjects] =>
)
Vor dem Cache sind noch alle Werte vorhanden
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 29.03.2011, 18:04:09

Wie sieht denn das Objekt codetechnisch aus? (Klassendefinition) Und wie die __sleep() Methode?
Auch die Properties verschwinden?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 29.03.2011, 18:13:09

Code: Alles auswählen

<?php

//<*UserBase:start*> DO NOT CHANGE THIS COMMENT!
/**
 * Automatically generated BaseObject for User. !!DO NOT CHANGE THIS BASE-CLASS!!
 * CHANGES WILL BE OVERWRITTEN WHEN UPDATING!!
 * You can change class "User" which will extend this base-class.
 */
import('modules::genericormapper::data', 'GenericDomainObject');
class UserBase extends GenericDomainObject {

    public function __construct($objectName = null){
        parent::__construct('User');
    }

    public function getDisplayName() {
        return $this->getProperty('DisplayName');
    }

    public function setDisplayName($value) {
        $this->setProperty('DisplayName', $value);
        return $this;
    }

    public function getFirstName() {
        return $this->getProperty('FirstName');
    }

    public function setFirstName($value) {
        $this->setProperty('FirstName', $value);
        return $this;
    }

    public function getLastName() {
        return $this->getProperty('LastName');
    }

    public function setLastName($value) {
        $this->setProperty('LastName', $value);
        return $this;
    }

    public function getStreetName() {
        return $this->getProperty('StreetName');
    }

    public function setStreetName($value) {
        $this->setProperty('StreetName', $value);
        return $this;
    }

    public function getStreetNumber() {
        return $this->getProperty('StreetNumber');
    }

    public function setStreetNumber($value) {
        $this->setProperty('StreetNumber', $value);
        return $this;
    }

    public function getZIPCode() {
        return $this->getProperty('ZIPCode');
    }

    public function setZIPCode($value) {
        $this->setProperty('ZIPCode', $value);
        return $this;
    }

    public function getCity() {
        return $this->getProperty('City');
    }

    public function setCity($value) {
        $this->setProperty('City', $value);
        return $this;
    }

    public function getEMail() {
        return $this->getProperty('EMail');
    }

    public function setEMail($value) {
        $this->setProperty('EMail', $value);
        return $this;
    }

    public function getPhone() {
        return $this->getProperty('Phone');
    }

    public function setPhone($value) {
        $this->setProperty('Phone', $value);
        return $this;
    }

    public function getMobile() {
        return $this->getProperty('Mobile');
    }

    public function setMobile($value) {
        $this->setProperty('Mobile', $value);
        return $this;
    }

    public function getUsername() {
        return $this->getProperty('Username');
    }

    public function setUsername($value) {
        $this->setProperty('Username', $value);
        return $this;
    }

    public function getPassword() {
        return $this->getProperty('Password');
    }

    public function setPassword($value) {
        $this->setProperty('Password', $value);
        return $this;
    }

}
// DO NOT CHANGE THIS COMMENT! <*UserBase:end*>

/**
 * Domain object for "User"
 * Use this class to add your own functions.
 */
class User extends UserBase {
    private $Attributes = array();
    /**
     * Call parent's function because the objectName needs to be set.
     */
    public function __construct($objectName = null){
        parent::__construct();
    }

    public function setAttribute($key, $value) {
        $this->Attributes[$key] = $value;
    }

    public function getAttribute($key) {
        if (isset($this->Attributes[$key])) {
            return $this->Attributes[$key];
        }
        return null;
    }

}

?>
Die __sleep Methode kommt aus dem GenericDomainObject (ich weiß, dass meine Attribute nach dem Cache verschwunden sind, aber die Properties dürften eigentlich nicht verschwinden -.-)
Komisch ist auch, dass properties, objectName und relatedObjects doppelt vorkommen nachdem das Object aus dem Cache geladen wurde, vorher allerdings nicht.
Bevor ich die UserList aus dem Cache lade habe ich ein

Code: Alles auswählen

import('brooklyn::modules::userpanel::objects', 'User');
 
eingebaut.

Es könnte auch an meinem eigenen CacheProvider liegen, den habe ich ganz vergessen

Code: Alles auswählen

<?php
/**
* Erstellt: 21.01.2011
* Autor: Toby
*/
import('tools::cache::provider','ObjectCacheProvider');
class ExtendedObjectCacheProvider extends ObjectCacheProvider {
    private $cacheTTL = 3600;
    
    public function read(CacheKey $cacheKey) {
        $ExtendedCacheObject = parent::read($cacheKey);
        if ($ExtendedCacheObject!==null && $ExtendedCacheObject->getAttribute('created')+$this->cacheTTL>time()) {
            return $ExtendedCacheObject->getAttribute('content');
        }
        return null;
    }
    
    public function write(CacheKey $cacheKey, $object) {
        $ExtendedCacheObject = new ExtendedCacheObject();
        $ExtendedCacheObject->setAttribute('content', $object);
        
        parent::write($cacheKey, $ExtendedCacheObject);
    }
}

class ExtendedCacheObject extends APFObject {
    public function __construct() {
        $this->setAttribute('created', time());
    }
}
?>
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 29.03.2011, 18:25:39

Hmm teste bitte mal folgendes, ohne cache provider:
im selben call: objekt im ursprungszustand mal ausgeben, danach serialisiere mal das objekt(serialize($obj)), gib den string aus, deserialisiere es (unserialize($str)), gib das neue objekt aus. Gibts da schon Probleme?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 12:54:25

Code: Alles auswählen

$UserObject = $GORM->loadObjectByID('User', 1);

        echo printObject($UserObject);
        $str = serialize($UserObject);
        echo printObject($str);
        $UserObject = unserialize($UserObject);
        echo printObject($UserObject);
        exit;
 
Erste Ausgabe -> Alles wunderbar
Beim serialize kommen dann Fehler:
serialize(): "objectName" returned as member variable from __sleep() but does not exist
serialize(): "properties" returned as member variable from __sleep() but does not exist
serialize(): "relatedObjects" returned as member variable from __sleep() but does not exist
Die Ausgabe nach dem Serialize:

Code: Alles auswählen

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Output of printObject():
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

O:4:"User":3:{s:10:"objectName";N;s:10:"properties";R:2;s:14:"relatedObjects";R:2;}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
Und beim unserialize dann auch:
unserialize(): Error at offset 0 of 410 bytes
Die Ausgabe nach dem unserialize

Code: Alles auswählen

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Output of printObject():
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
 
Wenn ich die genannten Eigenschaften im GenericDomainObject von private auf protected setze, dann gehen die Fehler beim serialize weg, den unserialize Fehler habe ich aber trotzdem noch, dass serialisierte Objekt hat dann die Ausgabe

Code: Alles auswählen

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Output of printObject():
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

O:4:"User":3:{s:13:"�*�objectName";s:4:"User";s:13:"�*�properties";a:15:{s:6:"UserID";s:1:"1";s:11:"DisplayName";s:10:"Web Master";s:9:"FirstName";s:3:"Web";s:8:"LastName";s:6:"Master";s:10:"StreetName";s:0:"";s:12:"StreetNumber";s:0:"";s:7:"ZIPCode";s:0:"";s:4:"City";s:0:"";s:5:"EMail";s:0:"";s:5:"Phone";s:0:"";s:6:"Mobile";s:0:"";s:8:"Username";s:9:"webmaster";s:8:"Password";s:64:"8c7d80230eea6345e577c08565c14fa681f53f6cdf566d144652225aaefaf5f8";s:17:"CreationTimestamp";s:19:"2011-03-29 16:41:42";s:21:"ModificationTimestamp";s:19:"0000-00-00 00:00:00";}s:17:"�*�relatedObjects";a:0:{}}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 13:01:33

Der unserialize Fehler kommt natürlich von

Code: Alles auswählen

$UserObject = unserialize($UserObject);
 
das muss

Code: Alles auswählen

$UserObject = unserialize($str);
 
heißen. Nachdem ich das geändert habe, und die Eigenschaften auf protected stehen, funktioniert das ganze
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 13:41:29

Was mir an der Erweiterung nicht gefällt ist, dass ich alles per import bekannt machen muss, d.h. ich muss immer sicherstellen, dass ich einen import durchgeführt habe bevor ich mit den Objekten arbeite (sofern diese aus dem Cache kommen)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 30.03.2011, 15:26:44

Wenn ich die genannten Eigenschaften im GenericDomainObject von private auf protected setze, dann gehen die Fehler beim serialize weg, den unserialize Fehler habe ich aber trotzdem noch, dass serialisierte Objekt hat dann die Ausgabe
Versteh ich das richtig, die private felder des GDO können in einem davon erbenden objekt nicht per __sleep() übertragen werden? wie hohl ist das denn...
Was mir an der Erweiterung nicht gefällt ist, dass ich alles per import bekannt machen muss, d.h. ich muss immer sicherstellen, dass ich einen import durchgeführt habe bevor ich mit den Objekten arbeite (sofern diese aus dem Cache kommen)
Wenn du einen vorschlag hast, wie man das automatisieren kann, her damit, aber mir fällt da keine andere Lösung ein..

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 15:33:24

Bis jetzt habe ich da noch keine Lösung gefunden (ein Workaround ist das importieren aller Objekte in der serviceobjects.ini)

Edit:
Und ja du verstehst richtig, obwohl die __sleep Methode eigentlich nur im GenericDomainObject ist und nicht in den generierten Objects funktioniert das ganze nicht so
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 30.03.2011, 15:35:57

Megger hat geschrieben:Bis jetzt habe ich da noch keine Lösung gefunden (ein Workaround ist das importieren aller Objekte in der serviceobjects.ini)
Ja die Idee hatte ich auch schon, hab sie aber schnell wieder verworfen, eindeutig zu unperformant.
Man KÖNNTE aber drüber nachdenken, in der serviceobjects.ini zu definieren, welche objekte vorimportiert werden sollen bei jedem request, sobald die geparst wird, das ist aber auch keine Garantie dafür, dass der GORM aufgebaut wird, bevor das Zeug aus der Session oder dem cache geladen wird....

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 16:32:53

Was irgendwie ein komisches Verhalten ist:
Wenn das GenericDomainObject von APFObject erbt, dann ist alles super, da das APFObject bekannt ist

Wenn ich nun aber das GenericDomainObject (welches nicht mehr vom APFObject erbt) importiere, dann habe ich bei untergeordneten Objekten trotzdem noch einen Fehler
Man KÖNNTE aber drüber nachdenken, in der serviceobjects.ini zu definieren, welche objekte vorimportiert werden sollen bei jedem request
Ist auch nicht wirklich besser, das verschiebt das Problem eigentlich nur.

Man müsste irgendwie erkennen um was für ein Object es sich handelt (möglich über den objectName und instanceof). Allerdings müsste man das dann irgendwo im CacheManager unterbringen, weil wenn ich die Objekte ausm Cache lade, dann kommt der GORM nicht zum Einsatz (vielleicht sollte ich den GORM einfach mal beziehen, auch wenn ich ihn nicht benutze)
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste