Ankündigung

Einklappen
Keine Ankündigung bisher.

MVC: Wie wird mein "Adressbuch" objektorientiert?

Einklappen

Neue Werbung 2019

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

  • MVC: Wie wird mein "Adressbuch" objektorientiert?

    Hallo Forum,

    ich nutze "Simple MVC Framework" und erstelle übungsweise eine kleine, private Webanwendung. Alle Daten kommen aus der Datenbank.

    Wenn ich nun alle Personen hole, kann ich sie im Template gleich ausgeben. Aber macht es nicht Sinn, diese Personen beispielsweise im Controller in einer Array festzuhalten oder soll ich getPersons() immer aufrufen, wenn ich die Personen brauche, obwohl sich nichts an den Daten geändert hat?

    Folgende Klassen habe ich:
    PHP-Code:
    <?php

    namespace Models;

    use 
    Core\Model;
    use 
    Helpers\Database;
    use 
    Core\Error;

    class 
    Person extends Model {
        protected static 
    $db;
        protected static 
    $table 'person';
        private 
    $personID// Wo fülle ich diese Felder am besten?
        
    private $firstname;
        private 
    $lastname;
        private 
    $contact;

        function 
    __construct() {
            
    parent::__construct ();
            
    self::$db Database::get ();
        }

        
    // hole alle vorhandenen Datensätze / Personen
        
    public static function getPersons() {
            return 
    self::$db->select "SELECT personID, firstname, lastname FROM " PREFIX self::$table ); // hier gibt es eine Fehlermeldung
            // soll hier eine foreach alle Datensätze in "new Person" packen?
        
    }

        
    // füge eine Person ein
        
    public function insertPerson($data) {
            if (
    is_array $data )) {
                
    $this->db->insert PREFIX $this->table$data );
                return 
    $this->db->lastInsertId 'personID' );
            } else {
                
    // Error::display ( '$data is not an array.' ); // TODO: not in model
            
    }
        }


        public function 
    deletePerson($where) {
            if (
    is_array $where )) {
                
    $this->db->delete $this->table$where );
            }
        }

        
    // jede Person hat "Contact"... Soll ich das Objekt so holen?
        
    public function getContact() {
            if (
    $this->contact == null) {
                
    $this->contact = new Contact $this->$personID ); // in dessen Konstruktor werden die Datensätze geholt.
            
    }
            return 
    $this->contact;
        }
    }

  • #2
    Es macht Sinn die irgendwie abzulegen, sonst würdest du ja, wie du schon bemerktest, sehr viele (gleiche) Datenbankabfragen starten, was deine Applikation unnötig verlangsamt.

    Kommentar


    • #3
      Also sollte ich einmal alle Personen aus der Datenbank holen und in einer Schleife Objekte der Klasse Person erstellen. Diese Liste speicher ich im Controller, damit mir diese Liste nicht verlorengeht.

      Kommentar


      • #4
        So wie du es im Moment hast, solltest du nur einmal eine Datenbankabfrage machen. Wäre ja schließlich sinnlos nochmal eine Datenbankabfrage zu machen, obwohl die Daten bereits vorhanden sind.

        Das ist das Problem daran direkte Datenbankabfragen in ein ein Model zu packen.
        Sowas gehört viel weiter unten angesiedelt in der Anwendungslogik. Frühestens in ein Repository.

        Du brauchst etwas, das Ergebnisse aus Datenbankabfragen speichert und zur Verfügung stellt. Beispielhaft dafür sind ORMs (Doctrine, Eloquent).

        Kommentar


        • #5
          Zitat von 147852369 Beitrag anzeigen
          Also sollte ich einmal alle Personen aus der Datenbank holen und in einer Schleife Objekte der Klasse Person erstellen. Diese Liste speicher ich im Controller, damit mir diese Liste nicht verlorengeht.
          Genau, du erstellst für jeden Benutzer ein Object des Models.
          Die Liste gehört auf jeden Fall nicht in den Controller. Der Controller hat nicht die Funktion der Datenhaltung. Sowas gehört z.B. in ein Repository, das dir dann die Objekte gibt.

          Kommentar


          • #6
            Mit Repository meinst du ein Pattern (kannte ich bisher nicht) und nicht ein Versionsverwaltungssystem wie bei Bitbucket oder?

            Kommentar


            • #7
              Natürlich

              Ein kleines Tutorial dazu:
              http://code.tutsplus.com/tutorials/t...ern--net-35804

              Kommentar


              • #8
                Der Mix von statischen und nicht-statischen Variablen und Methoden ist ein wenig seltsam. Darüber würde ich auch noch mal nachdenken.

                Faustregel: Mach nichts statisch, sondern übergib im Zweifel die benötigten Abhängigkeiten (etwa Datenbank-Objekt) als Konstruktor-Parameter (Stichwort Dependency Injection).

                Kommentar


                • #9
                  Mich wundert nur, dass in den ganzen Screencasts Repository Pattern nicht vorkommt. Vielleicht, weil Screencasts nur oberflächlich zeigen sollen, was ein Tool oder Framework kann?

                  Ich überlege, ob ich vielleicht doch Simple MVC Framework in Verbindung mit RedBeanPHP einsetze. Das sieht interessant aus: https://www.youtube.com/watch?v=Jw0NdcfyRcQ

                  "Passt" das?

                  Kommentar

                  Lädt...
                  X