Ankündigung

Einklappen
Keine Ankündigung bisher.

Konzept-Frage, DataManager-Klasse

Einklappen

Neue Werbung 2019

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

  • Konzept-Frage, DataManager-Klasse

    Hallo,
    so jetzt frage ich doch - nach einigen Stunden grübeln.

    Ich möchte 2 Klassen bauen, deren (optimales) Zusammenspiel ist mir allerdings selbst noch nicht ganz klar. Das hört sich erstmal komisch an, gemeint ist folgendes:

    Ich habe eine ganz normale Datenbank-Klasse DatabaseManager. Mittels Factory werden unterschiedliche Objekte erzeugt, momentan gibt es nur DatabaseManager_MySQL(), die von dieser Klasse erbt.
    Sie führt die mysql_*() Funktionen aus und loggt dazu noch die Queries und Fehler. Das übliche eben.

    Jetzt möchte ich nach dem gleichen Factory-Schema eine DataManager Klasse erstellen, die mir automatisch (in diesem Fall My-)SQL-Code erzeugt und diese an das DatabaseManager() Objekt weitergibt.
    Sei es get('username', 'Zergling') oder getAll() ..
    Zusätzlich zu dieser harmlosen Prozedur sollen noch die 1:n und n:m Verknüpfungen der selektierten Datensätze zum Ergebnis hinzugefügt werden.
    Am Ende also ein Array mit Objekten (den Datensätzen), die jeweils als weitere Eigenschaften wiederum Objekte (Fremdschlüssel-Verknüpfungen) haben können.
    Die Verknüpfungen erfährt die Klasse über einen PHP-Array, den es pro Tabelle gibt. Das "link"-Element behinaltet also zB einen Array mit dem Konfigurations-Array der zu verknüpfenden Tabelle und Angabe der Primärschlüsseln die zur Verknüpfung benötigt werden.

    Nur wie soll ich den DataManager verwenden?
    Statisch mit Übergabe des DatabaseManager-Objekts, dem Konfiguration-Array für die Tabelle die ich selektieren möchte plus den Selektionsbedingungen (Spalte, Werte, Sortierung, Limit)?
    Erscheint mir etwas viel.

    Zumal die Manager-Klasse ja eigentlich einen Zustand hat. Aber welchen eigentlich, die Datenbank oder die Konfiguration?

    Soll ich also pro Konfigurations-Array eine neue Instanz des Managers erstellen oder pro Datenbankverbindung?

    Wenn pro Datenbank-Verbindung, dann stellt sich ja die Frage, wozu dann überhaupt noch als Objekt.

    Am Ende möchte ich eigentlich nur leicht aus Tabelle News, Guestbook oder WhatEver selektieren.
    Oder würdet ihr komplett anders an die Sache rangehen?

    Was ist denn überhaupt besser - den DataManager die DB-Verbindung intern über die DatabaseManager() selbst aufzubauen oder den selbst aufrufen und ihr das explizit übergeben?

  • #2
    Hab mich gerade etwas umentschieden, wodurch sich die Frage teilweise auflöst. Ich übergebe dem Konstruktor die Datenbank-DSN und einen Konfigurations-Array der gesamten Datenbank. Macht ja eigentlich auch nur komplett im Zusammenspiel Sinn.

    config/test.php (Datenbank-Name)
    PHP-Code:
    <?php
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    $datamanager = array();
    //////////////////////////////////////////////////////////////////////////////////////////////////
    $datamanager['persons'] = array(
        
    'id'        => array('type' => 'primarykey'),
        
    'lastname'  => array('type' => 'varchar'),
        
    'firstname' => array('type' => 'varchar'),
        
    'nickname'  => array('type' => 'varchar'),
        
    'showname'  => array('type' => 'varchar'),
        
    'gender'    => array('type' => 'enum',       'enum' => array('m''f')),
        
    'birthday'  => array('type' => 'date'),
        
    'edited'    => array('type' => 'datetime'),
        
    'editor'    => array('type' => 'foreignkey''join' => 'users'));
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    $datamanager['users'] = array(
        
    'id'       => array('type' => 'primarykey'),
        
    'nickname' => array('type' => 'varchar'),
        
    'email'    => array('type' => 'email'),
        
    'password' => array('type' => 'password',   'hash' => 'sha1'),
        
    'person'   => array('type' => 'foreignkey''join' => 'persons'),
        
    'edited'   => array('type' => 'datetime'),
        
    'editor'   => array('type' => 'foreignkey''join' => 'users'));
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ?>
    Die Auswahl könnte dann so erfolgen:
    PHP-Code:
    <?php
    $manager 
    = new DataManager('mysql://username:pw@localhost/database'); // Konfigurations-Auswahl über DSN
    foreach ($manager->get('users''username', array('Zergling''Hydralisk')) as $userid => $user)  {
      echo 
    $db->nickname'
    '
    ;
    }
    ?>
    Eure Überlegungen dazu würden mich trotzdem interessieren

    Kommentar


    • #3
      Hi.

      In dem Fall kannst du die DataManager ja auch gleich von der DatabaseManager ableiten. Ich finde die Begriffe übrigens nicht passend. Die DatabaseManager ist ja eine einfache Verbindungs-Klasse und die DataManager verwaletet ja keine Daten sondern übersetzt deine Anfragen nur in SQL-Queries, die sie an die Verbindungs-Klasse weitergibt.

      Übrigens ist das Feld type in deinem Konfig-Array nicht ganz stimmig, denn mal legst du den Datentyp darein und mal die Info ob das Attribut den Primär- oder einen Fremdschlüssel hat. Ist aber schick, wenn du dr für INTs (etc.) dann direkt auch Integer-Werte anstatt String zurückgeben lassen kannst.

      Propel z.B. benutzt für die Beschreibung XML-Dateien:
      http://propel.phpdb.org/docs/user_gu...rted.XMLSchema

      Basti

      Kommentar


      • #4
        Hallo,
        danke für deine Antwort.

        Du hast Recht, "type" hat nicht konsequent die selbe Art von Wert.
        Auch der Link ist sehr interessant, die Idee mit dem XML gefällt mir besser als per PHP-Array.


        Das mit den Klassen-Namen sehe ich auch ein, allerdings fällt mir statt Manager kein treffenderer Begriff ein.

        DatabaseManager managed ja die Datenbank-Ankopplung und der DataManager greift ja eigentlich schon als Verwalter auf die Daten. Schließlich soll er später auch Daten schreiben können.

        DatabaseConnector() und DatabaseReader() vielleicht?

        Oder welche Namen würden dir (bzw. den anderen die noch mitlesen) treffender und aussagekräftiger erscheinen?

        Weitere Kritik ist weiterhin erwünscht :P

        Kommentar


        • #5
          DatabaseManager:

          - DataSource
          - Connection
          - Database vielleicht sogar (repräsentiert ja genau diese)

          DataManager:

          Oh, keine Ahnung. Vielleicht
          - QueryWrapper?

          Basti

          Kommentar


          • #6
            Hi.

            Ich beschäftige mich gerade SDOs. Vielleicht interessant für dich:

            http://zend.com/pecl/tutorials/sdo.php

            Basti

            Kommentar


            • #7
              Danke, da werde ich heut Abend mal reinschauen.
              Im PHP Magazin ist gerade auch ein kleiner Artikel darüber.

              Kommentar


              • #8
                Dein Foreign Key Konzept funktioniert auch nur für Fremdschlüssel auf Tabellen mit einem Primary Key wenn ich das richtig interpretiere. Ich finde das mit dem XML ja ganz schick, allerdings das auch noch vorher parsen zu lassen... Dann doch lieber nur einmal nach Ändern der DB Struktur...
                Wie willst Du komplexere Queries handhaben, mit mehreren joins oder Funktionen wie IF und CASE?

                Kommentar


                • #9
                  Für Komplexe Zugriffe kann man ja schließlich auch direkt Queries eingeben.
                  Hauptsächlich hatte ich Lust auf so eine Funktion, damit mir die üblichen 08/15 gib-mir-mal-alle-Datensätze-und-die-Datensätze-der-Fremdschlüssel Queries erspart bleiben.

                  Abstraktion eben. Der Nachteil davon ist eben meistens mangelhafte Komplexität, wobei das manchmal auf von Vorteil sein kann

                  Kommentar


                  • #10
                    Hi.

                    Ich bin da auch noch am Suchen. Im Moment bin ich auf dem Stand, ein zentrales Ojekt anzubieten, dass quasi das komplette Modell repräsentiert (entsprechend z.B. auch dem Root-Objekt des Graphen im oben verlinken Arktikel) und das aber, wie meine jetzigen DAOs auch, menschenlesbare Methoden mit eigenen Queries besitzt. Also z.B

                    PHP-Code:
                    <?php

                    $Users 
                    $this->ApplicationModel->getUsers();
                    $this->User Users->getById($this->Session->getUser->sId);

                    ?>
                    Die Typen der einzelnen Attribute zu definieren fände ich auch fein. Damit könnte man einmal das Problem lösen, dass mysql_fetch... selbst Werte auf int-Spalten als Strings zurückgibt und vor allem lassen sich Validatoren so ja am leichtesten umsetzen. Gerade was den Standard-Ablauf Formular > Überprüfen > wenn fehlerhaft Formular nochmal raus (mit Hinweisen) | wenn korrekt Objekt speichern ... angeht, wäre das ziemlich gut.

                    Basti

                    Kommentar

                    Lädt...
                    X