Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Klasse Order->addPosition() | Best practice

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

  • PHP Klasse Order->addPosition() | Best practice

    Liebe Freunde des performanten Quellcodes,

    ich beschäftige mich gerade mit OOP Programmierung in PHP und versuche eine Klasse (Order) zu erstellen, für Bestellungen in einem Onlineshop. Nun gibt es pro Bestellung n Positionen und ich frage mich wie das gut abgebildet werden kann. Aktuell habe ich das so gelöst:

    Im Konstruktor, der die Order zusammenbaut, gibt es eine Schleife, die die Positonen hinzufügt:
    PHP-Code:
    // Class Order      

    // method __construct
    foreach ($order->positions as $position) :
         
    $this->addPosition($position);
    endforeach; 
    Die Methode addPositon sieht wie folgt aus:

    PHP-Code:
    private function addPosition($position) {

    $p->id $position->id;
    $p->price_net $position->price->netPrice;
    $p->price_gross $position->price->grossPrice;
     
    // ...

    $this->positions[] = $p;

    Das funtioniert zwar soweit, aber ich bin mir nicht sicher, ob das so im Sinne des Erfinders ist. Über Ratschläge, Hinweise etc. bin ich dankbar.
    Restaurant Bewertungsportal yumee.de


  • #2
    PHP-Code:
    // Class Order      

    // method __construct
    foreach ($order->positions as $position) :
         
    $this->addPosition($position);
    endforeach; 
    Du greifst im Konstruktor auf die Properties des gerade zu erstellenden Objektes zu?
    Oder was ist in diesem Schnippsel $order?

    Sieht komisch aus, ich müsste da aber mehr sehen
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      PHP-Code:
          function __construct($order) {

              
      // build the order object
              
      $this->orderid $order->number;
              
      $this->kas_orderid NULL;
              
      $this->date $order->date;
              
      $this->changeDate $order->registered->changeDate;
              
      // ..

              // add positions to the order
              
      foreach ($order->positions as $position) :
                  
      $this->addPosition($position);
              endforeach;

          } 
      Im Parameter $order, dass dem Konstruktor übergeben wird, befindet sich ein JSON dekodiertes Objekt. Letztlich sollen Bestellungen aus JSON gelesen werden und die Bestellungen (orders) in die DB gespeichert werden.

      $order entsteht so:

      PHP-Code:
      // Holt eine JSON Datei aus dem Import Verzeichnis und
      $file = new File('order');
      // Gibt den Inhalt der Datei als PHP Objekt zurück
      $file_content $file->getContent()
      // Ein Order Objekt soll erstellt werden
      $order = new Order($file_content); 
      Restaurant Bewertungsportal yumee.de

      Kommentar


      • #4
        Dann zeige auch mal den dazugehörigen JSON-Code.

        Kommentar


        • #5
          Code:
          { 
             "number":"20003",
             "date":"2019-01-10 13:47:58",
             "changeDate":"2019-01-10 13:47:58",
             "shop":"noname",
             "locale":"de_DE",
             "currency":"EUR",
             "invoice":{ 
                "netPrice":85945.38,
                "grossPrice":102275
             },
             "shippingCosts":{ 
                "netPrice":0,
                "grossPrice":0
             },
             "positions":[ 
                { 
                   "id":54,
                   "number":"AA000000",
                   "price":{ 
                      "netPrice":14705.88,
                      "grossPrice":17500
                   },
                   "taxRate":19,
                   "ringWidth":null,
                   "wristbandLength":11,
                   "giftWrapping":false
                },
                { 
                   "id":55,
                   "number":"AA000001",
                   "price":{ 
                      "netPrice":41596.64,
                      "grossPrice":49500
                   },
                   "taxRate":19,
                   "ringWidth":null,
                   "wristbandLength":null,
                   "giftWrapping":false
                },
                { 
                   "id":56,
                   "number":"AA000003",
                   "price":{ 
                      "netPrice":10651.26,
                      "grossPrice":12675
                   },
                   "taxRate":19,
                   "ringWidth":51,
                   "wristbandLength":null,
                   "giftWrapping":true
                },
                { 
                   "id":57,
                   "number":"AA000004",
                   "price":{ 
                      "netPrice":18991.6,
                      "grossPrice":22600
                   },
                   "taxRate":19,
                   "ringWidth":null,
                   "wristbandLength":null,
                   "giftWrapping":false
                }
             ],
             "customer":{ 
                "shopNumber":"20007",
                "crmNumber":null,
                "email":"max@example.org"
             },
             "billingAddress":{ 
                "salutation":"mr",
                "title":"Dr.",
                "firstName":"Max",
                "lastName":"Mustermann",
                "street":"Borselstra\u00dfe",
                "houseNumber":"16f",
                "additional":"",
                "zipcode":"22765",
                "city":"Hamburg",
                "country":"Deutschland",
                "phone":"+49 123 456789"
             },
             "shippingAddress":{ 
                "salutation":"mr",
                "title":"Dr.",
                "firstName":"Max",
                "lastName":"Mustermann",
                "street":"Borselstra\u00dfe",
                "houseNumber":"16f",
                "additional":"",
                "zipcode":"22765",
                "city":"Hamburg",
                "country":"Deutschland",
                "phone":"+49 123 456789"
             },
             "shippingMethod":{ 
                "name":"Standard Versand"
             },
             "payment":{ 
                "name":"payengine3cw_paypal",
                "transactionId":"13CW98745229E332P",
                "clearingDate":"2019-01-10 13:47:58"
             }
          }

          Restaurant Bewertungsportal yumee.de

          Kommentar


          • #6
            Wieso belässt Du nicht einfach die Objecte Oder und Position ?
            Weibei mir nicht ganz klar ist, was der Unterschied von Class Oder und dem dort im __construct übergebenen oder ist.

            Kommentar


            • #7
              Zitat von tomBuilder Beitrag anzeigen
              Wieso belässt Du nicht einfach die Objecte Oder und Position ?
              Für die Weiterverarbeitung wird eine andere Datenstruktur benötigt, daher muss $order entsprechend umgewandelt und gemappt werden.

              Wir drehen hier m.E. aber einen zu großen Bogen. Eigentlich geht es mir im Kern darum, wie einem Klassenobjekt n verschiedene Attribute hinzugefügt werden können, hier als Beispiel Bestellung -> Positionen, dasselbe gilt aber auch für Unternehmen -> Mitarbeiter.



              Restaurant Bewertungsportal yumee.de

              Kommentar


              • #8
                Zitat von inkamina Beitrag anzeigen

                Für die Weiterverarbeitung wird eine andere Datenstruktur benötigt, daher muss $order entsprechend umgewandelt und gemappt werden.

                Wir drehen hier m.E. aber einen zu großen Bogen. Eigentlich geht es mir im Kern darum, wie einem Klassenobjekt n verschiedene Attribute hinzugefügt werden können, hier als Beispiel Bestellung -> Positionen, dasselbe gilt aber auch für Unternehmen -> Mitarbeiter.


                PHP-Code:
                addPosition(f$position) {
                    
                $this->positions[] = $position;

                war ja mein vorschlag.
                sonst ist mir nicht so klar was Du willst...

                edit:
                ach das

                Kommentar


                • #9
                  PHP-Code:
                  class OrderMapper {
                      public function 
                  fromDto(object $orderDto) {
                          
                  $order = new Order();

                          
                  $order->orderid $orderDto->number;
                          
                  $order->date $orderDto->date;
                          
                  $order->changeDate $orderDto->registered->changeDate;
                          
                  $order->positions = [];

                          foreach (
                  $orderDto->positions as $positionDto) {
                              
                  $position = new Position();

                              
                  $position->id $positionDto->id;
                              
                  $position->price_net $positionDto->price->netPrice;
                              
                  $position->price_gross $positionDto->price->grossPrice;

                              
                  $order->positions[] = $position;
                          }

                          return 
                  $order;
                      }

                  Kommentar


                  • #10
                    Danke @hellbringer, wofür steht Dto?
                    Restaurant Bewertungsportal yumee.de

                    Kommentar


                    • #11
                      https://de.wikipedia.org/wiki/Transferobjekt

                      Kommentar


                      • #12
                        hellbringer, EHRENMANN
                        Restaurant Bewertungsportal yumee.de

                        Kommentar

                        Lädt...
                        X