Portal > Foren > PHP > PHP-Programmierung > Table Data Gateway Pattern erklärung
Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 22.10.2008, 11:09 Nach oben    #1
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard Table Data Gateway Pattern erklärung

Hi, kann mir jemand irgendwie ein Tutorial geben wo das Table Data Gateway Pattern erklärt wird?
In meinem Buch (PHP Design Patterns) wird an der Stelle einfach auf Propel verwiesen. Das nützt mir ja nichts.
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 12:33 Nach oben    #2
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

beim TDGW-Pattern handelt es sich - kurz gesprochen - um einen Wrapper auf eine Tabelle. Implementierst du das, sollte deine Klasse die Methoden delete(), update() delete(), ... haben.

Sollte dich das Thema Mapping interessieren, kannst du ja auch mal unter http://de.adventure-php-framework.or...cher-OR-Mapper vorbeischaun.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 13:08 Nach oben    #3
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Hallo Gabriel,

beim TDGW-Pattern handelt es sich - kurz gesprochen - um einen Wrapper auf eine Tabelle. Implementierst du das, sollte deine Klasse die Methoden delete(), update() delete(), ... haben.
Das ist mir Prinzipiell klar. Was mich grad zum stocken bringt ist die Abstrakte implementierung.
Soll ich wirklich eine Abstrakte klasse machen á la:
PHP-Code:
/**
 * Pseudocode
 **/
abstract class TableDataGateway_Abstract 
{
    public function 
delete ($id) {
        
$sql "DELETE ...";
        
execute_query($sql);
    }
    public function 
insert ($data = array()) {
        
$sql "INSERT ...";
        
execute_query($sql);
    }
    public function 
update ($id$data=array())
    {
        
$sql "UPDATE...";
        
execute_query($sql);
    }

ODer wie meinst du das?
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 17:57 Nach oben    #4
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

ja, es sollte abstrakt sein. Das erreichst du durch eine Art "auto-discover", sprich die Factory, die dir dein konkretes gateway erstellt wird mit dem Namen der Tabelle initialisiert und erzeugt das Gateway mit den wichtigen Informationen über die Tabelle. Andere Möglichkeit ist eine Konfiguration, die die interessanten Parameter beinhaltet und diese beim Erstellen des konkreten Gateways diese and Hand eines Init-Parameter an die Fabric erzeugt. Letzteres habe ich für den GenericORMapper gewählt.

Allerdings würde ich die Klasse zwar mit "abstract" bezeichnen, sie jedoch nicht als "abstract" deklarieren, denn über die Factory ist sie ja konkret anwendbar.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 18:24 Nach oben    #5
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Ich muss sagen, erstere Möglichkeit klingt sehr verlockend. Nur hab ich noch keinen Schimmer wie ich das Umsetzen söllte, oder vlt hab ich auch einfach falsch vorstellungen.
Das Factorypattern fasst ja letztlich alle gleichen Methoden zusammen und lässt nur die Initialisierung eines Objekts offen, oder irre ihc mich da?

Iwie stehe ich grad derbste aufm Schlauch!
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 21:11 Nach oben    #6
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

ich vermute, du stellst dir das Thema zu schwer vor. Ich helfe dir mal mit ein bischen Quellcode:

PHP-Code:
   class TableDataGateWayFactory
   
{

      var 
$__gateways = array();

      function 
TableDataGateWayFactory(){
      }

      function &
getGateway($TableName,&$DatabaseDriver){

         
// return cached driver, if the driver already is initialized
         
$gatewayKey md5($TableName);

         if(isset(
$this->__gateways[$gatewayKey])){
            return 
$this->__gateways[$gatewayKey];
         }

         
// discover the desired table by use of the database driver.
         // the database driver is an instance of a database abstraction class.
         
$primaryKeyName = ...

         
// initialize the desired gateway and add it to the cache
         
$this->__gateways[$gatewayKey] = new AbstractTableDataGateWay();
         
$this->__gateways[$gatewayKey]->setTable($TableName);
         
$this->__gateways[$gatewayKey]->setPrimaryKeyName($primaryKeyName);
         ...

         
// return driver
         
return $this->__gateways[$gatewayKey];

      }
   }

   class 
AbstractTableDataGateWay
   
{

      var 
$__databaseDriver null;
      var 
$__table null;
      var 
$__primaryKeyName null;

      function 
AbstractTableDataGateWay(){
      }

      function 
update(){
         ...
      }

      function 
create(){
         ...
      }

      function 
delete(){
         ...
      }

      function 
select($id){

         
$select 'SELECT * FROM '.$this->__table.' WHERE '.$this->__primaryKeyName.' = \''.$id.'\';';
         
$result $this->__databaseDriver->executeTextStatement($select);
         
$data $this->__databaseDriver->fetchData($result);

         
$item = new TableDataGateWayItem();
         foreach(
$data as $rowName => $rowValue){
            
$item->setAttribute($rowName => $rowValue);
         }

         return 
$item;

      }

      function 
selectList($ids = array()){
         ...
      }

      function 
setDatabaseDriver(&$databaseDriver){
         
$this->__databaseDriver $databaseDriver;
      }

      function 
setTable($table){
         
$this->__table $table;
      }

      function 
setPrimaryKeyName($primaryKeyName){
         
$this->__primaryKeyName $primaryKeyName;
      }

   }


   class 
TableDataGateWayItem
   
{

      var 
$__attributes = array();

      function 
TableDataGateWayItem(){
      }

      function 
setAttribute($name,$value){
         
$this->__attributes[$name] = $value;
      }

      function 
getAttribute($name){
         return 
$this->__attributes[$name];
      }

   } 
Die Anwendung gestaltet sich dann so, dass du zunächst über die Factory dein konkretes Gateway ziehst - dabei sollte sinnvollerweise eine Datenbank-Abstraktion übergeben werden - und dieses dann z.B. per select() nach einem Datensatz fragst. Da es nicht nur ein RowDataGateway ist, solltest du entsprechende Methoden vorsehen - habe ich mit selectList() angedeutet - die dir entsprechend eine Tabelle zurückgeben. Diese besteht in meiner Implementierung aus einer Liste von Item-Objekten. Ist sicher nicht der Weisheit letzter Schluss, aber ich habe mir auch nur 10Min gegeben.

Ich hoffe, das hilft dir als Gedanken-Anstoss weiter. :)
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 22:54 Nach oben    #7
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Würde ich dann meine Konkreten klassen (also zum Beispiel eine Navigation) von AbstractTableDataGateWay ableiten und noch ein paar mehr Funktionen implementieren?

Aber vielen Dank erstmal so Grundsätzlich für deine Hilfe. Hilfst mir ja nun nicht zum erstenmal auf die Srpünge!
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.10.2008, 23:17 Nach oben    #8
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Zitat:
Würde ich dann meine Konkreten klassen (also zum Beispiel eine Navigation) von AbstractTableDataGateWay ableiten und noch ein paar mehr Funktionen implementieren?
Nein, das würde ich nicht tun, sondern für deine Menü-Komponente diese nutzen. Das sieht in der Praxis so aus, dass du beispielsweise einen Menü-Manager implementierst, der der Präsentationsschicht eine definierte API zur Verfügung stellt. Die Pres kann dann z.B. den Manager nach dem Navi-Baum fragen oder bearbeiten - also Methoden, die im Backend benötigt werden.

Der Manager wiederum nutzt das AbstractTableDataGateWay (abstract hier einfach, weil das Teil generisch wiederverwendbar ist) dann als Datenschicht seiner Anwendung. Sollte es mit dem TDGW nicht möglich sein auf einfache Weise die Anforderungen des Managers zu befriedigen, würde ich noch eine eigene Datenschicht für deine Menü-Komponente spendieren, die jedoch auch die TDGW-Komponente als Data-Access-Layer nutzt.

Direkt erben hat den Nachteil, dass du dir eine direkte Abhängigkeit schaffst, die es nicht erlaubt, deine DAO-Komponente gegen eine andere der gleichen API auszutauschen. Möchtest du z.B. später - weil das TDGW nicht mehr den Anforderungen entspricht - einen GenericORMapper einsetzen, so kannst du einfach eine Zeile austauschen und bist fertig. :)


Zitat:
Aber vielen Dank erstmal so Grundsätzlich für deine Hilfe. Hilfst mir ja nun nicht zum erstenmal auf die Sprünge!
Danke, das höre ich gerne! :)
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 08:58 Nach oben    #9
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Das Problem bei der "Abstrakten" Klasse ist ja aber genau das, dass sie abstrakt ist. Also keine für den Anwendungszweck zugeschnittenen Methoden hat. Letztlich müsste ich mich dann im Navimodul trotzdem um SQL Code kümmern. Das ist ja nicht Sinn der Sache, oder hab ich jetzt schon 9:00 Uhr am Morgen ne Denkblockade

Noch eine Frage die sich mir gerade stellt:
Ist die Factoryklasse dann eigentlich im Singletonepattern implementiert? Sonst würde der Cache ja mal so gar nichts bringen oder?!
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php

Geändert von kampfgnom (23.10.2008 um 09:02 Uhr) Grund: Zusatz
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 10:29 Nach oben    #10
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

Zitat:
Das Problem bei der "Abstrakten" Klasse ist ja aber genau das, dass sie abstrakt ist. Also keine für den Anwendungszweck zugeschnittenen Methoden hat.
Warum denn nicht? Du musst deine Klasse eben so implementieren, dass diese für jeden Anwendungsfall passt. Das bedeutet, dass die Methoden so generisch wie möglich sind. :) In meinem Beispiel ist das an sich auch schon der Fall. Die konkrete Nutzung definiert dann erst den konkreten Anwendungsfall. Das anders aufzuziehen verbaut dir ein bischen die Wiederverwendbarkeit.

Zitat:
Letztlich müsste ich mich dann im Navimodul trotzdem um SQL Code kümmern. Das ist ja nicht Sinn der Sache, oder hab ich jetzt schon 9:00 Uhr am Morgen ne Denkblockade
Das Navi-Modul muss sich - wie auch ohne TDGW - um seinen Code kümmern. Da du den SQL-Code im TDGW erzeugst und im Navi-Modul nur die Wrapper-Methoden nutzt. Nicht so kompliziert denken, es geht hier um die Abstraktion in unterschiedlichen Schichten.

Zitat:
Noch eine Frage die sich mir gerade stellt:
Ist die Factoryklasse dann eigentlich im Singletonepattern implementiert? Sonst würde der Cache ja mal so gar nichts bringen oder?!
Ich habe das im obigen Beispiel so gewählt, da ich im APF immer eine abstrakte Singleton-Implementierung nutze:

PHP-Code:
$db = &Singleton::getInstance('MySQLHandler');
$tdgwFab = &Singleton::getInstance('TableDataGateWayFactory');
$tdgw = &$tdgwFab->getGateway('my_table',$db);
... 
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geändert von dr.e. (23.10.2008 um 10:29 Uhr) Grund: removed typo
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 11:09 Nach oben    #11
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Was sagst du dazu:
PHP-Code:
<?php
abstract class Kanedo_Table_Data_Gateway_Abstract
{
    protected 
$table;
    
    protected 
$primary;
    
    protected 
$dbConnector;
    
    public function 
__construct()
    {
        
    }
    public function 
init($tablename$connector)
    {
        
$this->dbConnector $connector;
        
$this->table $tablename;
        
$this->primary get_primary_key(); //Muss ich mir noch überlegen, wie ich das mache!
    
}
    public function 
update()
    {
        
//@todo SQL Code
    
}
    public function 
select()
    {
        
//@todo SQL Code
    
}
    public function 
delete()
    {
        
//@todo SQL Code
    
}
}

class 
Kanedo_Factory 
{
    protected 
$gatewayCache = array();
    protected function 
__construct()
    {
        
/**
         * Singletone
         */
    
}
    
    function 
getGateway($TableName,$DatabaseDriver)
    {
        if (
key_exists($TableName$this->gatewayCache))
        {
            return 
$this->gatewayCache[$TableName];
        }
        
        include 
'Pfad/zu/Gate/Way/Klasse/'.$TableName.'.php';
        
$gw = new Pfad_zu_Gate_Way_Klasse();
        if (
$gw instanceof Kanedo_Table_Data_Gateway_Abstract)
        {
            
$gw->init($TableName$DatabaseDriver);
            
$this->gatewayCache[$TableName] = $gw;
            return 
$gw;
            
        }else {
            throw new 
Exception();
        }
   } 
}

class 
Nested_Sets extends Kanedo_Table_Data_Gateway_Abstract 
{
    public function 
getTree()
    {
        
/*
         * SQL Code zum auslesen des Kompletten baums
         */
    
}
}

$ns Kanedo_Factory::getInstance()->getGateway('Nested_Sets'$connector);
echo 
$ns->getTree();
?>
Damit hab ich zwei Vorteile. Ich brauch mich in der Klasse nicht mehr um Grundlegende Datenbank kommunikation zu Kümmern, hab sie aber inidviduell erweitert und initialisiert wird sie von der Factory!

Was meisnt du?!
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 15:04 Nach oben    #12
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

Zitat:
Kanedo_Table_Data_Gateway_Abstract
Ich finde diese benennung so unnatürlich. Man muss nicht alles von Zend übernehmen...

Zitat:
Kanedo_Factory
Diese Benennung ist auch irreführend, da kein Bezug hergestellt wird, welche Objekte erzeugt werden.

Zitat:
include 'Pfad/zu/Gate/Way/Klasse/'.$TableName.'.php';
Das würde ich so nicht implementieren, denn sonst bist du auf den angegebenen Namespace angewiesen. Weiterhin verwendest du wieder konkrete Implementierungen für einzelne Tabellen. Das spart nicht wirklich Tipparbeit.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 16:48 Nach oben    #13
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Hallo Gabriel,

Zitat:
Kanedo_Table_Data_Gateway_Abstract
Ich finde diese benennung so unnatürlich. Man muss nicht alles von Zend übernehmen...
Was is daran so schlimm? Ich finde, daran findet man zumidnest schnell heraus wo die Datei liegt!
Zitat:
Zitat von dr.e. Beitrag anzeigen
Zitat:
Kanedo_Factory
Diese Benennung ist auch irreführend, da kein Bezug hergestellt wird, welche Objekte erzeugt werden.
Das war ja nur schnell hingeschrieben. Den Namen muss ich noch genauer Spezifizieren.
Zitat:
Zitat von dr.e. Beitrag anzeigen
Zitat:
include 'Pfad/zu/Gate/Way/Klasse/'.$TableName.'.php';
Das würde ich so nicht implementieren, denn sonst bist du auf den angegebenen Namespace angewiesen. Weiterhin verwendest du wieder konkrete Implementierungen für einzelne Tabellen. Das spart nicht wirklich Tipparbeit.
Naja, aber sonst muss ich mich trotzdem um logik kümmern oder? Das spart genauso keine Tipparbeit!
Die Methoden die man implementieren kann, dass sie auf alle Tabellen passen sind viel zu abstrakt als das sie nützlich wären.
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.10.2008, 18:35 Nach oben    #14
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Zitat:
Was is daran so schlimm? Ich finde, daran findet man zumidnest schnell heraus wo die Datei liegt!
Die Bennennung ist unnatürlich hinsichtlich den Regeln der Sprache. Du sagst ja auch nicht

Zitat:
Straße der Ende liegt Haus das
oder doch? Weiterhin sollte - siehe JAVA - die Eindeutigkeit über den Namespace hergestellt werden.

Zitat:
Naja, aber sonst muss ich mich trotzdem um logik kümmern oder? Das spart genauso keine Tipparbeit!
Die Methoden die man implementieren kann, dass sie auf alle Tabellen passen sind viel zu abstrakt als das sie nützlich wären.
Ich glaub das hast du nicht verstanden. Tipparbeit sparst du dir nur, wenn du die Implementierung so allgemeingültig hälst, dass die auf alle Tabellen anwendbar ist! Der Anwendungsfall NestedSet hat zunächst nichts mit dem TDGW zu tun. Wenn du dich da schon in Anwendungsfällen verstrickst, wirst du es nicht schaffen, das generisch zu implementieren. Versuche hier einfach in Schichten und kleinen Komponenten zu denken.

BTW: NestedSets sind auch eine denkbar schlechte Anwendung für das TDGW.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.10.2008, 22:23 Nach oben    #15
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 456
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Ich glaub das hast du nicht verstanden.
Das glaub ich auch
Zitat:
Zitat von dr.e. Beitrag anzeigen
Tipparbeit sparst du dir nur, wenn du die Implementierung so allgemeingültig hälst, dass die auf alle Tabellen anwendbar ist! Der Anwendungsfall NestedSet hat zunächst nichts mit dem TDGW zu tun. Wenn du dich da schon in Anwendungsfällen verstrickst, wirst du es nicht schaffen, das generisch zu implementieren. Versuche hier einfach in Schichten und kleinen Komponenten zu denken.
Ok, das akzeptier ich jetzt mal so, weil ich einfach keine Erfahrung habe.

Allerdings habe ich eine Frage zu deinem Vorher geposteten Quellcode.
Du übergibst ein $DatabaseDriver. Was genau kann der?
Bisher hab ich eine Verbindungsklasse, die mit Api klassen versorgt wird. So wird sichergestellt, das die Verbindung über eine Art Proxy unabhängig von der Verwendeten Datenbank möglich ist.
Diese API Klassen implementieren alle ein Interface.

Aber die machen letztlich nichts anderes als die Verbindung aufzubauen und die Verbindungsressource zurück zugeben.

Sollte ich da schon verschiedene Fkt wie Select, Update, Delete, etc. einbauen.
Bzw. ist meine "API Klasse" das was bei dir der DatabaseDriver ist?
Vielleicht komme ich so schneller dahinter wie das funktioniert.
__________________
Mein Blog: http://aedo.redio.de RSS: http://aedo.redio.de/feed
Kanedo CMS Projektseite: http://kanedo.redio.de/de/
RSS: http://kanedo.redio.de/rss.php
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.10.2008, 12:22 Nach oben    #16
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 198
Standard

Hallo Gabriel,

der DatabaseDriver ist eine Service-Schicht, die den Zugriff auf die Datenbank abstrahiert. Diese bietet Methoden wie executeStatement() bzw. fetchData(). Eine Definition so einer Klasse findest du unter http://adventure-php-framework.org/f...l_handler.html Im APF abstrahiere ich eine konkrete Datenbank-Verbindung noch mit dem connectionManager, der als Datenbank-Verbindungs-Factory dient.

Eine konkrete Implementierung einer Methode kann dabei im APF wie folgt aussehen:

PHP-Code:
function create($item){
   
$cM = &$this->__getServiceObject('core::database','connectionManager');
   
$sql = &$cM->getConnection('my_connection_key');
   
$insert $this->__createStatementByItem($item);
   
$sql->executeTextStatement($insert);

$item ist dabei eine Instanz der Klasse TableDataGateWayItem. Unter __createStatementByItem() verstehe ich eine Methode, die dir eine konkretes Statement bastelt. Je nach dem, ob bereits das Primary-Key-Attribut im Item enthalten ist oder nicht, kommt da ein INSERT oder UPDATE raus. So kannst du das intern nochmals sauber abstrahieren.

Soweit klar?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL 5.1 kommt in die Beta-Phase Ben Nachrichten 1 02.03.2006 14:31


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47