php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 06.01.2011, 03:14  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard [Erledigt] Konzept Model von MVC

Hallo

Ich mache mir Gedanken darüber, wie man vom MVC den Model-Teil programmieren könnte. Dazu sind mir 2 Varianten eingefallen.

Ausgangsbasis:
PHP-Code:
class // beliebige Klasse, dessen Daten in der DB gespeichert werden
{
   public 
$x;
   public 
$y;
   public 
$z;
   public function 
__construct($x$y$z)
   {
      
$this->$x;
      
$this->$y;
      
$this->$z;
   }

Um hier alles möglichst einfach zu halten, werden in keiner Klasse setter/getter verwendet.
Die properties sind allesamt public.

Es gibt eine Datenbank:
PHP-Code:
class MySql
{
   public function 
query($str)
   {
      
// ...
   
}

Und auch noch einen WebService:
PHP-Code:
class Web
{
   public function 
send($str// hier kann man dem Webserice etwas schicken
   
{
      
// ...
   
}

In der MySQL-Tabelle A gibt es dann nicht nur die Spalte x, y und z, sondern auch die Spalte id.

Es soll möglich sein, Daten aus MySql auszulesen und dem Webservice zu schicken.

Variante 1:

Hier wird NICHT von A geerbt.
PHP-Code:
class ADb
{
   public 
$id// fragt man Daten von MySQL ab, erhält man noch eine id
   
public $a;  // A-Instanz als property
   
public function select($id)
   {
      
$db       = new MySql();
      
$result   $db->query('SELECT x,y,z FROM a WHERE id = '.$id.';');
      
$this->id $id;
      
$this->a  = new A($result->x$result->y$result->z);
   }

PHP-Code:
class AWeb
{
   public 
$uid// fragt man Daten vom Webservice ab, erhält man z. B. noch eine uid
   
public $a;   // A-Instanz als property
   
public function send()
   {
      
$web = new Web();
      
$web->send($this->a->x.$this->a->y.$this->a->z);
   }

PHP-Code:
$aWeb = new AWeb();
$aDb  = new ADb();
$aDb->select(1);
$aWeb->$aDb->a// hier übergibt man eine A-Instanz
$aWeb->send(); 
Variante 2:

Hier WIRD von A geerbt.
PHP-Code:
class ADb extends A
{
   public 
$id// fragt man Daten von MySQL ab, erhält man noch eine id
   
public function select($id)
   {
      
$db       = new MySql();
      
$result   $db->query('SELECT x,y,z FROM a WHERE id = '.$id.';');
      
$this->id $id;
      
$this->x  $result->x;
      
$this->y  $result->y;
      
$this->z  $result->z;
   }

PHP-Code:
class AWeb extends A
{
   public 
$uid// fragt man Daten vom Webservice ab, erhält man z. B. noch eine uid
   
public function send()
   {
      
$web = new Web();
      
$web->send($this->x.$this->y.$this->z);
   }

PHP-Code:
$aWeb = new AWeb();
$aDb  = new ADb();
$aDb->select(1);
$aWeb->$aDb->x// hier muss man x, y und z einzeln übergeben
$aWeb->$aDb->y;
$aWeb->$aDb->z;
$aWeb->send(); 
Vergleich der beiden Varianten:

Variante 1 hat eine aufwendigere Programmierung von ABd und AWeb, dafür jedoch eine einfache Programmierung im Hauptprogramm. Es muss nur ein A-Objekt übergeben werden.
Variante 2 hat eine einfachere Programmierung von ABd und AWeb, dafür muss im Hauptprogramm jede Eigenschaft von A einzeln ausgelesen und übergeben werden.

Mein Favorit wäre Variante 1.

Was ist eure Meinung dazu?

P. S. wie bin ich auf das gekommen? Es gab hier mal im Forum von jemanden ein Thema, wo es um MVC ging. Und dort hatte ich so etwas erwähnt: eine Kombination aus Datenbank und Webservice. Darum habe ich mir das hier überlegt. Aber ich bin in OOP noch nicht 100% sattelfest. Deshalb würde mich die Meinung von den Profis interessieren.

Geändert von coola (06.01.2011 um 10:17 Uhr). Grund: getter/setter eliminiert, alle properties public ... wird übersichtlicher
coola ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 06.01.2011, 03:39  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich würde es noch etwas weiter abstrahieren.
Ein ServiceLayer, dem man Mapper übergibt, welche wiederum DataAccessObjects erhalten.
Ein Mapper baut dann ein Model aus DataTransferObjects zusammen, kann aber auch ein Set an Models generieren.
Damit kommt man recht gut von der "Datenbank-Denke" weg - denn ein z.B. User-Model hat eigentlich nichts mit einer Zeile in der DB zu tun.
So ganz abschließend hab ich das aber auch noch nie geplant und zwecks Uhrzeit mag ich mir da grad auch keine Gedanken mehr dazu machen.
Sollte ja aber erstmal als Denkanstoß reichen.
Noch zwei kleine Tipps: schau dich z.B. bei Matthew Weier O'Phinney um und leg' dir, falls nicht vorhanden, Patterns of Enterprise Application Architecture von Martin Fowler zu.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 06.01.2011, 09:51  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Habe jetzt im #1 die getter/setter eliminiert. Mir ist klar, dass man das dann im Endeffekt nicht machen sollte. Habe es aber gemacht, damit es übersichtlicher und kürzer wird. Hier geht es nur um das Grundkonzept.

Geändert von coola (06.01.2011 um 10:05 Uhr).
coola ist offline   Mit Zitat antworten
Alt 06.01.2011, 11:43  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Ein Denkanstoß bezüglich Variante 2: Google mal nach "favour composition over inheritance" - Vererbung ist keine Allzweckwaffe!
fab ist offline   Mit Zitat antworten
Alt 06.01.2011, 19:40  
Erfahrener Benutzer
 
Benutzerbild von bitsnack
 
Registriert seit: 01.08.2010
Beiträge: 352
PHP-Kenntnisse:
Fortgeschritten
bitsnack befindet sich auf einem aufstrebenden Ast
bitsnack eine Nachricht über ICQ schicken bitsnack eine Nachricht über MSN schicken bitsnack eine Nachricht über Skype™ schicken
Standard

Ein Model erbt von einer Grundklasse der Models die sich um die Datenbankverbindung etc kümmert. Im Model sind öffentliche Methoden (oder setter/getter bzw öffentliche Eigenschaften im Falle von ORM) durch die Daten abgefragt und gespeichert werden.
Im Controller (oder wo auch immer) wird ein Objekt des Models angelegt und durch die Methoden Daten geladen und gespeichert. Entweder kann man das Model-Objekt in einer Instanzvariable des Controllers speichern und immer darauf zugreifen (macht z.B. CodeIgniter so):
PHP-Code:
$this->user_model->add($_POST); 
oder man erstellt in diesem Beispiel pro Benutzer ein Objekt (würde ich eher empfehlen):
PHP-Code:
$user = new User();
$user->create_from_array($_POST);
$user->get_posts($user_id); 
oder man lehnt sich eben an ein ORM an welches ich selbst sehr gerne nutze:

PHP-Code:
$user = new User();
$user->values($_POST)->save();

$user = new User($user_id);
$user->get_posts(); 
bitsnack ist offline   Mit Zitat antworten
Alt 06.01.2011, 20:44  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Zitat:
Ein Model erbt von einer Grundklasse der Models die sich um die Datenbankverbindung etc kümmert.
Das gefällt mir aber nicht.

Eine Frau IST ein Mensch. Ein Mensch IST ein Lebewesen. Hier hat man 2 IST-Beziehungen, d. h. man macht 2 Vererbungen. Frau erbt von Mensch, Mensch erbt von Lebewesen.

Nach deine Philosophie würde jetzt eine der Klassen von Datenbank erben? Könnte in diesem Falle nur bei Lebewesen sein. Also Lebewesen IST eine Datenbank?

Das passt nicht.

Abgesehen davon habe ich in #1 ein Bespiel eingetragen, wo es nicht nur eine DB, sondern auch einen Webservice gibt.

Lebewesen müsste dann von Datenbank und Webservice erben? Funktioniert nicht. PHP kennt keine Mehrfachvererbung.

Geändert von coola (06.01.2011 um 20:49 Uhr).
coola ist offline   Mit Zitat antworten
Alt 06.01.2011, 20:52  
Erfahrener Benutzer
 
Benutzerbild von bitsnack
 
Registriert seit: 01.08.2010
Beiträge: 352
PHP-Kenntnisse:
Fortgeschritten
bitsnack befindet sich auf einem aufstrebenden Ast
bitsnack eine Nachricht über ICQ schicken bitsnack eine Nachricht über MSN schicken bitsnack eine Nachricht über Skype™ schicken
Standard

Nein, nein. Die Grundklasse der Models speichert nur ein Objekt der Datenbankklasse in einer Eigenschaft wie z.B. DB. Dies kann über Dependency Injection, Registry, Factory oder was auch immer geschehen. Die Grundklasse ist also nicht die Datenbank sondern kümmert sich nur darum. Vom Model selbst muss sowieso rein gar nichts mehr erben.
Was der Webservice konkret mit dem Model zu tun hat erschliesst sich mir auch nicht: ist im Grunde genommen doch auch nur eine weitere Klasse welche das Model nutzt (und nicht davon erbt)?

Also eher Klasse X nutzt Model X, Model X ist ein Model, Model nutzt Datenbank.
bitsnack ist offline   Mit Zitat antworten
Alt 06.01.2011, 20:57  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Dann probier mal nach dieser Philosophie folgendes zu machen: Du liest Daten aus der DB und verschickst sie an den Webservice. Also wie in #1. Ich glaube nicht, dass das nach deiner Philosophie möglich ist. Zumindest kann ich mir so eine Programmierung nicht vorstellen.

Also von Tabelle a die Daten in eine A-Instanz und dann die Daten an den Webservice verschicken.
coola ist offline   Mit Zitat antworten
Alt 06.01.2011, 20:59  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von bitsnack Beitrag anzeigen
Also eher Klasse X nutzt Model X, Model X ist ein Model, Model nutzt Datenbank.
Und genau da liegt der Fehler.
Ein Model weiß nichtmal, was eine Datenbank ist, geschweige denn, wie man eine benutzt.
Darum kümmert sich ein spezialisierter Mapper, wovon es auch gerne mehrere geben kann, z.B. einer, der mit Webservices arbeiten kann, einer für DBs, einer für Flatfiles etc.
Sehr interessant ist dieser Webcast: http://www.slideshare.net/weierophin...bjects-1766001
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 06.01.2011, 20:59  
Erfahrener Benutzer
 
Benutzerbild von bitsnack
 
Registriert seit: 01.08.2010
Beiträge: 352
PHP-Kenntnisse:
Fortgeschritten
bitsnack befindet sich auf einem aufstrebenden Ast
bitsnack eine Nachricht über ICQ schicken bitsnack eine Nachricht über MSN schicken bitsnack eine Nachricht über Skype™ schicken
Standard

Em bitte?

PHP-Code:
$data = new Data_Model($data_id);
$this->send($data->get_data()); 
Habe das Gefühl dass wir völlig aneinander vorbeireden.

Zitat:
Zitat von G.Schuster Beitrag anzeigen
Und genau da liegt der Fehler.
Ein Model weiß nichtmal, was eine Datenbank ist, geschweige denn, wie man eine benutzt.
Darum kümmert sich ein spezialisierter Mapper, wovon es auch gerne mehrere geben kann, z.B. einer, der mit Webservices arbeiten kann, einer für DBs, einer für Flatfiles etc.
Sehr interessant ist dieser Webcast: http://www.slideshare.net/weierophin...bjects-1766001
Mit der Datenbank meinte ich eben ein Objekt irgendeiner für den Datenspeicher zuständigen Klasse.
In Models wie es sie in CodeIgniter gibt nutzen die Methoden der Models einfach direkt das Datenbankobjekt (z.B. einen QueryBuilder). Alternativ können die Methoden auch nur die Eigenschaften des Models bearbeiten welche dann wieder von der Grundklasse gespeichert werden.

Geändert von bitsnack (06.01.2011 um 21:06 Uhr).
bitsnack 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] Framework Kernel Konzept Geryon Software-Design 36 06.10.2010 22:23
[MVC] Daten verschlüsseln & entschlüsseln im Controller oder Model singu Software-Design 19 31.08.2010 00:18
MVC: Request-Parameter ändern, im Controller oder Model? singu Software-Design 5 29.07.2010 17:19
Model view controll Leberwurstbrot PHP Tipps 2010 14 05.03.2010 18:14
Konzept einer Datenbankabstraktion Dark Guardian Software-Design 29 30.01.2010 18:13
Kohana model bereich splasch PHP Tipps 2010 0 24.01.2010 09:03
MVC Model Daten als Referenz oder Kopie übergeben? serious-cool PHP Tipps 2009 1 12.01.2010 22:10
[Erledigt] Konzept für einen PHP Web Crawler Dark Guardian Software-Design 10 23.11.2009 16:31
MVC Konzept Babbsdrebbler Software-Design 6 30.10.2009 08:13
Konzept für Bowsergame Wiillli Beitragsarchiv 1 21.10.2009 15:18
Singleton Model oder Vererbung ? MollocH PHP-Fortgeschrittene 2 10.02.2009 20:32
kleines DB Konzept Tomte Datenbanken 21 23.08.2008 10:22
Konzept Frage (2), DB Package greg PHP-Fortgeschrittene 0 15.07.2006 14:19
Konzept GFX-Community PHP Tipps 2005-2 2 22.08.2005 10:22

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php model, mvc php mysql, php mvc mysql, mvc php datenbank-lesen, datenbank verbinden mit mvc model code, mvc, php mvc mysql class, php mysql mvc, mvc mehrere models, g session_container, php mvc, php mvc model mysql, http://www.php.de/php-fortgeschrittene/75807-konzept-model-von-mvc.html, mvc mehere model, php einfaches mvc konzept, was ist ein model php, komponentendiagramm, mvc modell aus mysql, php-model, php simples model konzept

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:20 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