Ankündigung

Einklappen
Keine Ankündigung bisher.

Daten aus Fremdsystemen in Objekte umwandeln und nutzen sinnvoll?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Daten aus Fremdsystemen in Objekte umwandeln und nutzen sinnvoll?

    Ich arbeite viel mit Daten aus anderen Quellen, das sind relationale Datenbanken wie auch LDAP-Verzeichnisdienste oder Daten die mir via REST-API zur Verfügung stehen.
    Zur Verarbeitung dieser Daten habe ich immer wieder dieselben Aufgaben:
    • Daten aus dem Fremdsystem lesen (ggf. nur ein Subset davon nutzen)
    • Daten mit meinen Methoden verarbeiten und ggf. manipulieren
    • Daten in das Fremdsystem zurückschreiben
    • In bestimmten Fällen auch neue Daten im Fremdsystem anlegen
    Also die ganz klassischen CRUD Operationen. Da ich die Daten gern in einem objektorientierten Stil verarbeiten möchte parse ich das Quellformat in ein internes Format mittels einer Klasse. Hier bin ich immer wieder auf das Thema gestoßen feststellen zu müssen ob und welche Daten im Verlauf meiner Verarbeitung verändert wurde um diese Veränderung dann später ggf. ins Fremdsystem zurückzuschreiben. Auch wie die Daten verändert wurde ist für mich dabei teils von großer Bedeutung, zumindest im Sinne von Vorher/Nachher.
    Dafür habe ich mir eine Basis-Klasse geschrieben die über getter/setter die Manipulationen abfängt und so Änderungen "sichtbar" machen kann, was sonst mit einfachen public Eigenschaften nicht möglich wäre.

    Gibt es eigentlich einen generischen Ansatz für dieses "Problem"? Ein Pattern und ggf. auch schon fertige Implementationen dazu?

    Ich bin etwas an meine Grenzen gestoßen als ich feststellen musste das nicht alle der zu verarbeitenden Daten Entitäten im Sinne von einfachen Datentypen darstellen, sondern teils selbst auch Arrays oder Objekte sein können. Hier dann die Manipulationen zu erkennen war aufwändig.

    Gern stelle ich "meine" Lösung des Problems mal vor, wenn das von Interesse ist oder hilft meine Fragen zu beantworten. Vorerst sehe ich das genannte aber als global gültiges Problem an, denn das dürfte ja praktisch jeder Entwickler schonmal gehabt haben.

  • #2
    Ich bin mir nicht sicher ob ich dein Anliegen korrekt erfasst habe, aber suchst du ein Serializer / Deserilizer?
    Wenn ja könntest du dir einmal The Serializer Component (Symfony Docs) oder Serializer - serializer Documentation (master) (jmsyst.com) anschauen.

    Kommentar


    • #3
      Hmm, es geht in die Richtung, trifft es aber nicht wirklich. Vielleicht habe ich mich zu kompliziert ausgedrückt und ein Beispiel wäre besser gewesen.
      Ich nehme jetzt mal eines meiner vielen Anwendungsfälle, nämlich LDAP. Von einem OpenLDAP-Verzeichnis lese ich die Eigenschaften einer Gruppe, die da sind:
      • cn
      • dn
      • member
      • memberOf
      • description
      All diese Daten lade ich mittels einer ldap_search() Funktion gemäß eines Suchfilters (z.B. dem Gruppennamen, also dem "cn"). Jetzt möchte ich die speichern und erstelle dafür ein "LdapGroup" Object (eine Subklasse des von mir angesprochenen "BasicDataObject"). Dieses implementiert ein Interface zum parsen von Daten aus einem Array. Die zu parsenden Attribute sind in der LdapGroup Class in einer Map definiert und referenzieren letztlich auf Properties der Class. Da LDAP in einigen Dingen recht "speziell" ist, z.B. das man Attribute hat die direkt einen Wert enthalten, andere wiederum diese erst in einem Array verschachteln, kommt man mit einer generischen Array-Parse Funktion nicht aus, sondern überschreibt die geerbte Methode mit einer Spezialbehandlung für LDAP-Ergebnismengen.

      Am Ende habe ich die gewünschten Eigenschaften in das Objekt übertragen und kann nun damit arbeiten, z.B. indem ich über "$ldapGroup->addMember($ldapUser)" ein weiteres Gruppenmitglied hinzufüge.
      Damit ich später dann weis wie ich die geänderte Gruppe ins LDAP zurückschreiben muss, merke ich mir in einer Tabelle der LdapGroup die veränderten Felder. Daraus leite ich dann ein Diff ab, welches mir z.B. sagt "die Eigenschaft "member" wurde um einen Eintrag erweitert". Über eine "modifiedFields()" Funktion ermittle ich dann die Änderung und generiere LDAP-Kommandos um diese zu applizieren.

      Ähnlich läuft das bei anderen Quellen.

      Die Kunst liegt also nicht darin das Format einer Nachricht umzuwandeln, sondern den Inhalt zu verstehen und umzusetzen.

      Kommentar


      • #4
        Wenn ich es richtig verstanden habe, wären das im Fall der Serilizer dann ja die Normalizer. z.B. um ein DateTime String in ein DateTime Objekt umzuwandeln und zurück. Hier kannst du natürlich auch eigene hinzufügen und so steuern wie die Eigenschaften in dein Objekt kommen und wie sie wieder zurück serialisiert werden können.

        Mit LDAP kenne ich mich leider nicht gut aus, aber ich denke das Konzept lässt sich auch darauf anwenden.

        Kommentar

        Lädt...
        X