php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 17.06.2011, 00:05  
Neuer Benutzer
 
Registriert seit: 16.06.2011
Beiträge: 4
PHP-Kenntnisse:
Anfänger
sans befindet sich auf einem aufstrebenden Ast
Standard Datenbankabfragen auslagern

Hallo zusammen,

ich habe mein Problem bereits in der Contao-Community geschildert, allerdings kann mir dort niemand so recht helfen. Und da es sowieso weniger ein Contao spezifisches Problem, sondern eher eine Designfrage ist, versuche ich es hier

Contao-Extensions bestehen i.d.R. aus einer Klasse, in denen bis auf die View alles zusammengewürfelt wird.
Ich arbeite nun an einer Schnittstelle zu einer komplexen Datenbank, für die die MySQL-Abfragen entsprechend umfangreich sind. Damit der Code übersichtlich bleibt suche ich nun nach einer Möglichkeit, die Abfragen auszulagern.

Ich habe mir überlegt, für jede Gruppe von Abfragen ein eigenes Model zu schreiben. Z.B. alle Abfragen betreffend Dokumente/Downloads werden in einer Klasse DownloadsModel gesammelt. Analog alles was mit Kontakten zu tun hat in einer ContactsModel usw.
Irgendwie habe ich aber damit das Gefühl, dass es bis auf die Umsetzung nicht mehr viel mit OOP zu tun hat. Bin daher für jegliche Vorschläge/Anregungen/Ideen dankbar

Beispiel-Model:
PHP-Code:
class DownloadModel extends Model 


    
/** 
     * Connect to crm database 
     */ 
    
public function connect() 
    { 
        
$this->Database->setDatabase($GLOBALS['TL_CONFIG']['crmDbDatabase']); 
        
$this->Database->execute("SET NAMES 'utf8'");                 
    } 
     
    
/** 
     * Disconnect from crm database 
     */ 
    
public function disconnect() 
    { 
        
$this->Database->setDatabase($GLOBALS['TL_CONFIG']['dbDatabase']); 
        
$this->Database->execute("SET NAMES 'utf8'"); 
    } 
     
    
/** 
     * Sample method 
     */ 
    
public function getProducts($params
    { 
        
$sql "SQL"
        return 
$this->Database->execute($sql); 
    } 


Extension:
PHP-Code:
// Import model 
$this->import('DownloadModel'); 

// Switch database to crm 
$this->DownloadModel->connect(); 
// Sample query 
$objResult $this->DownloadModel->getProducts($params); 
// Switch database back to contao 
$this->DownloadModel->disconnect(); 

print_r($objResult); 
Die Methoden connect() und disconnect() würde ich in die Elternklasse auslagern, damit die nicht in jeder Modelklasse stehen müssen.
Leider muss ich vor jeder Abfrage an eine externe Datenbank die Verbindung neu aufbauen (und danach wieder zurück), da Contao keine zwei Verbindungen gleichzeitig verwalten kann.


Hätte ich mit dem Auslagern in eine Klasse einiges an Performanceverlust?
Eine Alternative wäre, die Abfragen in Funktionen auszulagern, denen dann jeweils die Verbindung als Parameter übergeben wird. Aber das finde ich noch unschöner.

Mfg
sans
sans ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 17.06.2011, 02:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

1. Ist die Frage drüben gerade mal 1 1/2 Tage alt.
Zitat:
allerdings kann mir dort niemand so recht helfen
finde ich da etwas unpassend. Anmerkungen zu Crosspostings
2. Findest Du wohl eher nen Entwickler für Contao in Contaoforum, als im Entwicklerforum jemanden, der zufällig mit Contao arbeitet
3. Ist die Frage sehr allgemein gehalten. Da ich Contaos Struktur nicht kenne, weiß ich nicht was man da groß antworten sollte (und kennte*) ich sie, würde sich daran vermutlich wenig ändern), außer: na mach doch.

*) igitt
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 17.06.2011, 03:28  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Zitat:
Irgendwie habe ich aber damit das Gefühl, dass es bis auf die Umsetzung nicht mehr viel mit OOP zu tun hat.
Wieso nicht? Das klingt schon okay. Zu viel Grübelei über „das perfekte Design“ (tm) dauert meiner Meinung nach (a) lange und führt (b) trotzdem gerne zu verkomplizierendem Overengineering. Ist jetzt natürlich pauschal ausgedrückt, aber in einem Bruchteil der Zeit hast du's im Zweifel dreimal refaktoriert.

(Damit will ich nicht sagen, dass Designüberlegungen schlecht wären. Meiner Erfahrung nach verliert man sich dabei aber gerne in Details und bremst sich selbst aus. Hängt aber auch davon ab, ob du in der Gruppe arbeitest oder allein. – Na ja, egal, ich schweife ab.)

Zitat:
Hätte ich mit dem Auslagern in eine Klasse einiges an Performanceverlust?
Nein. Nicht spürbar.

Namespaces für deine Klassennamen (MyExtension_DownloadModel) wären vielleicht noch gut, falls du nicht zufällig die syntaktischen Namespaces (namespace-PHP-Sprachkonstrukt) nutzt.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 17.06.2011, 08:29  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zu viel Grübelei über „das perfekte Design“ (tm) dauert meiner Meinung nach (a) lange und führt (b) trotzdem gerne zu verkomplizierendem Overengineering.
Sehe ich auch so - Für ein Plugin sieht das in meinen Augen auch ok aus - Auch in Hinblick auf OOP.
xm22 ist offline   Mit Zitat antworten
Alt 17.06.2011, 09:17  
Benutzer
 
Registriert seit: 25.03.2011
Beiträge: 52
PHP-Kenntnisse:
Fortgeschritten
Maxefix befindet sich auf einem aufstrebenden Ast
Standard

Naja, schau dir mal ein paar PHP-Frameworks an. Da hat jede Tabelle auch ihre eigene Klasse. Deine Idee ist schon gut und macht sicherlich Sinn.

Allerdings jedes mal die Datenbank-Verbidung neu aufzubauen halte ich für etwas unglücklich gelöst. Warum lagerst du das nicht in eine eigene Klasse aus, die sich wirklich nur um die Kommunikation mit der Datenbank kümmert?

Die Klasse (ich nenn sie mal "Datasource") holst du dann in deine Models rein (z.B. der Dependency Injection). Somit muss die Verbindung nur einmal aufgebaut werden. Und solltest du mal die Datenbank wechseln musst du nur diese Klasse anpassen.

Gruß,
Max
Maxefix ist offline   Mit Zitat antworten
Alt 17.06.2011, 12:28  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.020
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Was mich stören würde ist die Verwendung des Begriffs Model. Wenn da nur Abfragen drin stehen würde ich es nicht unbedingt als Model bezeichnen. Aber prinzipiell passt das schon.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 17.06.2011, 14:59  
Neuer Benutzer
 
Registriert seit: 16.06.2011
Beiträge: 4
PHP-Kenntnisse:
Anfänger
sans befindet sich auf einem aufstrebenden Ast
Standard

Hey vielen Dank für eure Antworten
Wie es aussieht werde ich also in der Richtung bleiben.

Ihr habt recht, ein perfektes Design ist nicht nötig und wahrscheinlich auch nicht möglich.
Echte Namespaces sind eine gute Idee, da sowieso PHP > 5.3 auf dem Server läuft. "Namespaces" über Datei- bzw. Klassennamen möchte ich vermeiden, da eh schon alle Dateien (Vorgabe von Contao) im gleichen Ordner liegen müssen.

Leider muss ich die Datenbankverbindung jedes mal neu aufbauen, da Contao nur eine Verbindung gleichzeitig verwalten kann. Aber eigentlich könnte ich auch selbst eine Verbindung herstellen. Die Contao Methoden wie execute() etc. sind ja eigentlich nur Wrapper für die PHP Befehle.
Die vielen Connects drücken wahrscheinlich viel eher auf die Performance wie alles was mit OOP machbar ist

Ich habe mir andere Frameworks angesehen: CakePHP und CodeIgniter machen es ähnlich wie mein Vorschlag. Von Zend konnte ich nichts konkretes finden. Und Flow3 und Symfony2 verwenden ein ähnliches System mit dem ich mich nicht auskenne. Wie nennt man das wenn PHP-Code über Kommentare (Flow3) oder mit use (Symfony2) gesteuert wird?


Würde es ausreichen, wenn ich einfach in meinem BaseModel die Datenbankverbindung herstelle?
Die Datenbank muss nicht austauschbar sein. Und wenn, würde es ja nicht ausreichen einfach nur die "Datasource" zu ändern, wenn ich in den Models direkt Mysqli-Funktionen verwende. Oder sehe ich das falsch?
Mein Ziel ist es einfach ein sauberes Modul zu haben, das ggf. auch nach mir weiterentwickelt werden kann, ohne aber das ganze zu komplex werden zu lassen. D.h. irgendwelche eigenen DI-Container zu programmieren, oder fertige zu verwenden wäre mehr als Overkill


@mquadrat: welchen Begriff würdest du stattdessen vorschlagen?

Geändert von sans (17.06.2011 um 15:07 Uhr).
sans ist offline   Mit Zitat antworten
Alt 17.06.2011, 16:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
da Contao nur eine Verbindung gleichzeitig verwalten kann.
Na und? Die kannst Du doch nutzen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 17.06.2011, 17:12  
Neuer Benutzer
 
Registriert seit: 16.06.2011
Beiträge: 4
PHP-Kenntnisse:
Anfänger
sans befindet sich auf einem aufstrebenden Ast
Standard

Ja, aber ich muss nach der Abfrage bzw. spätestens vor der nächsten Abfrage für Contao (z.B. Navigation, User Auth etc.) wieder auf die Contao Datenbank zurückwechseln.
Contao verwendet eine andere Datenbank wie die die ich aus meiner Schnittstelle ansprechen muss.
sans ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] mit php generiertes js auslagern outlaw JavaScript, Ajax und mehr 6 07.04.2011 10:34
Best Practice: Datenbankabfragen tarian Software-Design 21 21.01.2011 21:52
?section=xxx aus index.php auslagern ?? lordcyphon PHP Tipps 2009 11 07.11.2009 01:05
[Erledigt] Tabellenlayout: Große Felder auslagern? boernard Datenbanken 7 27.07.2009 14:03
[Erledigt] For-Schleife für DB-Abfrage auslagern? Sermon PHP Tipps 2009 18 20.03.2009 19:14
Funktionen auslagern mafra PHP Tipps 2008 10 15.03.2008 09:24
Abfrage in Funktion auslagern - lohnt sich das? tayke Datenbanken 4 15.11.2007 23:36
Auslagern von Menü & Header SoulDream PHP Tipps 2008 3 07.11.2007 13:23
DB-Verbindungsaufbau auslagern? ark1707 PHP Tipps 2008 1 12.09.2007 08:04
Problem mit Javascript: lässt sich nicht auslagern blinkster.de HTML, Usability und Barrierefreiheit 2 01.10.2005 15:20
Programmteile auslagern juhuwoorps PHP Tipps 2005 16 14.03.2005 10:13
Teile des Quellcodes auslagern PHP Tipps 2005 13 23.02.2005 18:34
Klassenmethoden auslagern und includen PHP-Fortgeschrittene 16 20.01.2005 18:03
Funktionen auslagern und auf variablen zugreifen Crypi PHP Tipps 2004 3 14.10.2004 13:43
KLasse auslagern funktioniert nicht Crypi PHP Tipps 2004 17 23.09.2004 16:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
contao externe datenbank, contao datenbankabfrage, contao datenbank ändern, contao mysql abfrage, contao datenbank abfragen, contao datenbank abfrage, contao andere datenbank, contao ohne eigene datenbank, php-script contao mysql, contao eigene datenbank, contao model, php mysql query in funktionen auslagern, contao eigene datenbankabfrage erstellen, contao mysql query in php datei, contao externe php daten, view-abfrage in contao-db, php datenbankverbindung dauert, datenbank in ein separates tabellenblatt auslagern, contao datenbankschnittstelle kassensystem, jede abfrage einzelne klasse

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:36 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum