PHP Objekt Eigenschaften dynamisch auslesen/setzen

[ChAoZ]

Rear Admiral
Registriert
Jan. 2010
Beiträge
5.305
Hallo zusammen,

etwas ganz simples.

Ich habe ein Json (Request) wie das hier:
JSON:
{
    "title": "none",
    "salutation": "Herr",
    "dateOfBirth": "26.10.1996"
}

oder wie das hier:
JSON:
{
    "email": "max.muster@domain.tld",
    "nichtRelevanterWert": "vielleicht"
}

oder sowas:
JSON:
{{
    "firstnname": "Max",
    "lastname": "Muster",
    "lastname2": "",
    "nichtRelevanterWert": "ja"
}

Nun muss ich feststellen ob die Daten sich unterscheiden (Session <> Payload), und wenn ja, updaten (DB/Session), sonst nicht.
Mal ist eine E-Mail Adresse drin, mal ein ganzer Datensatz des Kunden, also unterschiedlicher Payload.

Meine Methode zum Ermitteln der Unterschiede sah bisher so aus:
PHP:
        $firstname = $payload->get('firstname');
        if (null !== $firstname && $firstname !== $session->getCustomer()->getFirstname()) {
            $diff->add('firstname', $firstname);
        }

        $lastname = $payload->get('lastname');
        if (null !== $lastname && $lastname !== $session->getCustomer()->getLastname()) {
            $diff->add('lastname', $lastname);
        }

        $lastname2 = $payload->get('lastname2');
        if (null !== $lastname2 && $lastname2 !== $session->getCustomer()->getLastname2()) {
            $diff->add('lastname2', $lastname2);
        }

        $dateOfBirth = $payload->get('dateOfBirth');
        if (null !== $dateOfBirth && $dateOfBirth !== $session->getCustomer()->getFormattedDateOfBirth()) {
            $diff->add('dateOfBirth', $dateOfBirth);
        }

        $email = $payload->get('email');
        if (null !== $email && $email !== $session->getCustomer()->getEmail()) {
            $diff->add('email', $email);
        }

        // usw.

Nun, das ist kein schöner Code. Ich würde es gern ändern.
Das Problem ist nur, ich habe auch "nicht relevante" Werte in Payload.

Einfach mit array_diff geht es also nicht, da so auch "nicht relevante" Werte als Unterschied ausgewiesen werden. Daher ist meine Methode so, wie sie ist. Sie geht nur bestimmte, vordefinierte Werte durch und guckt ob sich der Wert unterscheidet (natürlich ist die Methode deutlich größer als hier abgebildet).

Wie kann ich das Ganze schöner gestalten, ohne dass die Komplexität extrem zunimmt und der Code unleserlich wird? Wenn es nicht möglich ist, dann lasse ich es so...

Danke euch
 
Wenn ich die Werte die ich explizit zum Vergleich benötige, aus dem Array hole, dann mache ich exakt dasselbe wie jetzt, nur in einer Schleife und dynamischen Function Calls. Sehe da keinen Mehrwert darin....
Danke dir
 
Aktuell hat die Methode 10 If Abfragen :freak:
Natürlich meckert da SonarQube sofort.... also wollte ich es gern anders lösen.

Wenn der Payload immer desselbe wäre, könnte ich ohne Probleme mit array_diff arbeiten, das tue ich schon bei Adressänderung so, da kommt stets dieselbe JSON Struktur, das klappt super.

Aber hier habe ich mal eine E-Mail, mal Vor und Nachname + Zuname usw....
Mein Wunsch wäre schon EINE generische Methode die alle Usecases bedient, wie jetzt halt, nur ohne 10 If Statements und ungern "zu komplex" (haben auch Junior Devs hier im Team).
 
Achso du hast eigene Methoden für die Abfrage von firstname, lastname usw.
Dann schreib dir eine method getAttribute oder so der du dynamisch den Feldnamen übergeben kannst. Andernfalls kommst du ohne hässliche Verrenkungen (dynamische function calls) nicht drumherum und hast immer noch kaum was gespart.
 
  • Gefällt mir
Reaktionen: [ChAoZ]
Habe ich mir schon gedacht... vieles ausprobiert, vieles klappt auch aber der Code ist nicht besser dadurch, nur kürzer :D danke dir
 

Ähnliche Themen

Zurück
Oben