[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.
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Screeze » 30.03.2011, 16:54:31

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
Klingt in der Tat komisch, dürfte auch überhaupt nicht funktionieren, weil das objekt wenns aus dem cache kommt ja garnicht wissen kann von welchem Objekt es erben soll, oder?
Bist du dir sicher dass das GDO da noch nirgends geladen wurde, in den GORM dateien wurde es ja schon automatisch eingebunden, sobald der GORM einmal bezogen war...
Ist auch nicht wirklich besser, das verschiebt das Problem eigentlich nur.
Weswegen ich da auch etwas skeptisch bin, andererseits lade ich z.b. in einer statischen fc-action bereits meine gorm instanz und schreib sie in die registry, damit ich sie überall auf den selben (sehr kurzen) Weg daraus laden kann, ohne erst wieder ne factory zu instanzieren etc. Dadurch wäre dann immerhin bei mir sicher dass der GORM vor allem geladen wurde, und somit die in der config als "wichtige" DOs markierten auch importiert wurden bereits.
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)
Das wird nicht möglich sein, weil du ja nur ein serialisiertes objekt zur verfügung hast, was im endeffekt ein string sein dürfte, ein instanceof o.ä. wird da nicht viel bringen, und generisch ist das auch nicht lösbar..
Was ich mich aber grade Frage: zu welchem Zeitpunkt werden denn Objekte, die ich in die Session geschrieben habe, wieder in "richtige" Objekte umgewandelt? Zum Zeitpunkt des ersten Zugriffs auf den entspr. Session-key?

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 17:28:19

Klingt in der Tat komisch, dürfte auch überhaupt nicht funktionieren, weil das objekt wenns aus dem cache kommt ja garnicht wissen kann von welchem Objekt es erben soll, oder?
Bist du dir sicher dass das GDO da noch nirgends geladen wurde, in den GORM dateien wurde es ja schon automatisch eingebunden, sobald der GORM einmal bezogen war...
Das Problem ist ja der erste Zugriff auf das Objekt und da ist das Problem, dass die Klassendefinition nicht bekannt ist. Außerdem habe ich das GDO per import vorher schon eingebunden und dann hat es auch funktioniert, wenn ich aber zum Beispiel das User Objekt anpasse und da auf eine Methode zugreife, dann muss ich das User Objekt zuerst importieren, ansonsten bekomme ich den Fehler.
Weswegen ich da auch etwas skeptisch bin, andererseits lade ich z.b. in einer statischen fc-action bereits meine gorm instanz und schreib sie in die registry, damit ich sie überall auf den selben (sehr kurzen) Weg daraus laden kann, ohne erst wieder ne factory zu instanzieren etc. Dadurch wäre dann immerhin bei mir sicher dass der GORM vor allem geladen wurde, und somit die in der config als "wichtige" DOs markierten auch importiert wurden bereits.
Aber bei denen, die nicht direkt importiert werden, hast du wieder das gleiche Problem, finde ich eine schlechte Lösung
Das wird nicht möglich sein, weil du ja nur ein serialisiertes objekt zur verfügung hast, was im endeffekt ein string sein dürfte, ein instanceof o.ä. wird da nicht viel bringen, und generisch ist das auch nicht lösbar..
Was ich mich aber grade Frage: zu welchem Zeitpunkt werden denn Objekte, die ich in die Session geschrieben habe, wieder in "richtige" Objekte umgewandelt? Zum Zeitpunkt des ersten Zugriffs auf den entspr. Session-key?
unserialize ist ja kein Problem, denn der Fehler tritt erst auf, wenn ich auf eine Methode zugreife. Nun müsste man mal testen, ob dies auch der Fall ist, wenn ich mit instanceof feststelle um was für ein Object es sich handelt

So in der Art

Code: Alles auswählen

if ($object instanceof GenericDomainObject) {
    $objectName = $object->getObjectName();
    //import anhand des ObjectName aus der serviceobjects.ini
}
 
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, 17:35:18

Das Problem ist ja der erste Zugriff auf das Objekt und da ist das Problem, dass die Klassendefinition nicht bekannt ist. Außerdem habe ich das GDO per import vorher schon eingebunden und dann hat es auch funktioniert, wenn ich aber zum Beispiel das User Objekt anpasse und da auf eine Methode zugreife, dann muss ich das User Objekt zuerst importieren, ansonsten bekomme ich den Fehler.
Jein, ich glaub wir reden aneinander vorbei.

Was du zuerst gesagt hast, war doch, dass wenn ein GDO vom APFObject geerbt hatte, man das GDO trotzdem importieren konnte, und auf die eigenschaften zugreifen konnte, oder hab ich das falsch verstanden?
Das dürfte aber garnicht gehen, weil in dem Moment, wo es geladen wird, wie du gesagt hast, keine Klassendefiniton bekannt ist, deshalb auch kein "extend APFObject" bekannt sein kann, und es deshalb garnicht möglich sein kann, dass das dann weis dass es als Basis das APFObject verwenden kann - das meinte ich...
unserialize ist ja kein Problem, denn der Fehler tritt erst auf, wenn ich auf eine Methode zugreife. Nun müsste man mal testen, ob dies auch der Fall ist, wenn ich mit instanceof feststelle um was für ein Object es sich handelt
Das dürfte irgendwas mit incomplete object sein oder so, das hatten wir die Tage ja mal festgestellt schon, da wird ein pseudoobject erstellt irgendwie, die Frage ist, ob das automatisch wieder korrigiert wird, sobald ich die entspr. Klasse einbinde, oder ob die zwingend vorher vorhanden sein muss.

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 17:44:57

Was du zuerst gesagt hast, war doch, dass wenn ein GDO vom APFObject geerbt hatte, man das GDO trotzdem importieren konnte, und auf die eigenschaften zugreifen konnte, oder hab ich das falsch verstanden?
Man konnte das GDO aus dem Cache laden ohne es vorher importieren zu müssen, aber wahrscheinlich lag es wirklich daran, dass es irgendwo schon mit vorher mal mit dem GORM importiert wurde und deswegen dort kein Fehler auftrat.
Das dürfte irgendwas mit incomplete object sein oder so, das hatten wir die Tage ja mal festgestellt schon, da wird ein pseudoobject erstellt irgendwie, die Frage ist, ob das automatisch wieder korrigiert wird, sobald ich die entspr. Klasse einbinde, oder ob die zwingend vorher vorhanden sein muss.
Und genau das ist das Problem. Wenn ich ein Objekt bei einem Request unserialize und auf eine Methode zugreife, dann bekomme ich diesen Incomplete Fehler. Wenn ich aber vor dem Zugriff einen entsprechenden import einbaue, dann habe ich diesen Fehler nicht. Werde mal testen, ob ich den Fehler auch schon bekomme wenn ich mit instanceof prüfe, um welches Objekt es sich handelt
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, 17:56:08

aber wahrscheinlich lag es wirklich daran, dass es irgendwo schon mit vorher mal mit dem GORM importiert wurde und deswegen dort kein Fehler auftrat.
Da bin ich mir sogar ziemlich sicher, alles andere käme mir sehr unlogisch vor...

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 18:01:14

Habe mal meinen Workaround mit dem importieren aller Service Objekte ausgebaut -> Incomplete Fehler trat auf
Dann habe ich folgendes in meinen ExtendedObjectCacheProvider eingebaut, da ich damit eigentlich alles Cache

Code: Alles auswählen

private function checkInstance($value) {
        if(is_array($value)) {
            foreach($value as $item) {
                $this->checkInstance($item);
            }
        } else if($value instanceof GenericDomainObject) {
            import('modules::genericormapper::data', 'GenericDomainObject');
            $objectName = $value->getObjectName();

            $config = $this->getConfiguration('brooklyn::lagersystem', 'lagersystem_serviceobjects.ini');
            if($config!==null) {
                $Section = $config->getSection($objectName);
                if($Section!==null) {
                    $namespace = $Section->getValue('Namespace');
                    $class = $Section->getValue('Class');

                    if($namespace!==null && $class!==null) {
                        import($namespace, $class);
                    }
                }
            }
        }
    }
Et Voila, es funktioniert

Ist allerdings eine sehr quick und sehr dirty Lösung :D
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, 18:14:00

wtf, das funktioniert???
Das GDO das du verwendest ist aber schon ein User-objekt o.ä.? d.h. wenn das GDO bekannt ist kannst du auf die basisfunktionen von DOs zugreifen, wenn diese im GDO bereits definiert sind (getObjectName())? woher weis das teil das dass vom GDO erbt ohne das Objekt selbst zu kennen? hmmmm

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 18:19:28

Zu früh gefreut, es funktioniert doch nicht -.- Eben hat es noch funktioniert und auch bei ein paarmal neuladen der Seite, nun habe ich das gleiche Problem wie vorher auch. Also das importieren muss doch vor dem unserialize passieren und da hat man keine Informationen um was es sich handelt.

Nun fällt mir erstmal auch nichts mehr ein, muss darüber nochmal nachdenken -.-

Edit:
Hat mich auch gewundert, dass es funktioniert hat, war mehr so ein Verzweifelungsakt
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, 18:27:44

Was mich interessieren würde:
Wenn du das objekt deserialisierst, danach (ohne zu versuchen rauszufinden was das objekt ist, und ohne irgendwas an dem objekt zu machen) die objektdefinition importierst, ist es dann das korrekte objekt, oder immernoch kaputt?

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 18:28:38

Ist dann immernoch kaputt -.-
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
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von dr.e. » 30.03.2011, 22:43:24

Hallo Jungs,
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...
Das ist einfach "normale" Sichtbarkeits-Regel. In einem erbenden Objekt kann nicht mehr direkt auf die privaten Felder zugegriffen werden, weil diese eben nur für die Basis-Klasse bestimmt sind. ;)

Der Trick an der Sache mit dem serialize() + unserialize() ist immer, dass die Objekte jeweils davor bekannt sind, bevor das unserialize() ausgeführt wird. Andernfalls wird sich der "incomplete object"-Fehler immer einschleichen. Es reicht IMHO also in der FC-Action oder was auch immer, die Objekte zu importieren und dann einfach aus dem Cache zu ziehen. Auch geht das in der KOmponente, die den CacheManager nutzt vor dem Laden der Objekte. Das ist eine PHP-Eigenheit, die für mich auch absolut verständlich ist, sich aber nicht ändern lässt.
Viele Grüße,
Christian

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 30.03.2011, 23:55:53

Da werde ich mir nochetwas bauen, sodass ich nur den Namen des Objects übergeben muss und dann der passende import ausgeführt wird
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 » 31.03.2011, 13:08:42

Habe mir jetzt eine Methode für den BaseMapper geschrieben

Code: Alles auswählen

/**
    * @public
    *
    * Imports the PHP File in which the service object is defined
    *
    * @param string $objectName The name of the object to be imported
    *
    * @author Tobias Lückel
    * @version
    * Version 0.1, 31.03.2011<br />
    */
   public function importServiceObject($objectName) {
       // invoke benchmark timer
      $t = &Singleton::getInstance('BenchmarkTimer');
      $t->start('BaseMapper::importServiceObject()');

      // get object configuration
      $objectsConfig = $this->getConfiguration($this->configNamespace, $this->configNameAffix . '_serviceobjects.' . $this->getConfigFileExtension());

      // extract configuration to support pre 1.13 GORM config
      $section = $objectsConfig->getSection($objectName);
      if($section!==null) {
          $namespace = $section->getValue('Namespace');
          $class = $section->getValue('Class');
          if($namespace!==null && $class!==null) {
              import($namespace, $class);
          }
      }

      $t->stop('BaseMapper::importServiceObject()');
   }
 
Da kann ich dann mit dem GORM einfach drauf zugreifen und importiere damit vor dem Zugriff auf den Cache einfach die entsprechenden Dinge
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
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von dr.e. » 31.03.2011, 13:18:11

Das wird sicher funktionieren, ändert aber die Tatsache nicht, dass die Verwendung "manuell" aufgelöst werden muss.

@Ralf: wie war beim Konzept der Erweiterung das Thema Abhängigkeiten geplant? Ich meine, wir hatten da über explizite Auflösung durch import() gesprochen. Oder?
Viele Grüße,
Christian

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

Re: [1.14] [GORM] modellierungserweiterung

Beitrag von Megger » 31.03.2011, 13:30:10

Ja natürlich muss man es noch manuell ausführen, aber anders wird es nicht gehen (außer man importiert einfach alles, aber das ist blöd)
Mit meiner Methode kann ich wenigstens einfach diese Dinge importieren.

Code: Alles auswählen

$GORM->importServiceObject('User');
 
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 1 Gast