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 Thema bewerten
Alt 05.07.2011, 20:32  
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

Nicht wirklich.
__________________
--
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
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 06.07.2011, 11:15  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Verstehe nicht, warum Du dem Objekt nicht einfach paar Methoden spendierst.
Wenn ich dich richtig verstehe, soll ich meinem Order_Mapper-Objekt die vor dir exemplifizierten Methoden per Vererbung spendieren. Diese Überlegung habe ich doch bereits in meinem ersten Beitrag vorgestellt, oder nicht? Demnach würde ich das als Bestätigung auffassen.

Zitat:
Zitat von nikosch Beitrag anzeigen
Viel besser wäre doch

loadOrders ($db , $query)

und die Query bauste draußen zusammen.
Die Datenbank-Verbindung ($db) injiziere ich dem Mapper-Objekt via Konstruktor. Den Query draußen zusammenzubauen und zu übergeben halte ich allerdings für fragwürdig. Die Bezeichnung loadOrders() impliziert, dass bestimmte Daten geladen werden sollen. Konsequenterweise halte ich es für sinnvoll, die zentralen Bestandteile des Queries in der Methode fest zu verankern. Damit meine ich primär die SELECT/FROM-Anweisungen. Würde ich das nicht machen, müsste ich mich fragen, ob die Bezeichnung der Methode noch einen Sinn hat.

Nach meiner Auffassung erledigen die Methoden einer Mapper-Klasse nicht nur das Mapping (Persistenz -> Domänen-Objekt), sondern implementieren auch bspw. die konkreten Queries. Darin sehe ich auch den Vorteil der Mapper-Methoden. Ich kann eine Methode wie loadOrders() aufrufen und muss mich nicht um Erstellung des Queries kümmern. Einzig geht es mir darum, spezielle fixe Methoden dynamisch ergänzen zu können. Eben mit ORDER, WHERE, LIMIT oder GROUP BY Klauseln.
Trainmaster ist offline   Mit Zitat antworten
Alt 06.07.2011, 14:20  
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

Ich kenne die restliche Klasse jetzt nicht, aber entscheidend ist doch wohl eher, dass dort Ergebnisse der Abfrage auf Businessbestandteile gemappt werden (was immer auch mapToObject tut). Die Query ist zwar spezifisch, ich finde es aber genauso legitim, Mapper und Query bspw. über eine Factory zu erzeugen und die Query in ein eigenes Objekt auszulagern. Finde ich persönlich sauberer.

Zitat:
Die Datenbank-Verbindung ($db) injiziere ich dem Mapper-Objekt via Konstruktor.
Nö, tust Du nicht.
Zitat:
$db = Database::Singleton();
Ich bin auch der Meinung, man muss nicht die Datenbankconnection immer im Objekt vorhalten, wenn nur eine Methode die braucht.
__________________
--
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 06.07.2011, 17:37  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
entscheidend ist doch wohl eher, dass dort Ergebnisse der Abfrage auf Businessbestandteile gemappt werden
Genau das wird getan.
PHP-Code:
private function mapToObject(array $result) {
    
$oOrder = new Order;            
    if (isset(
$result['id'])) {
        
$oOrder->setId($result['id']);
    }    
    
// ...
    
return $oOrder;

Zitat:
Zitat von nikosch Beitrag anzeigen
Die Query ist zwar spezifisch, ich finde es aber genauso legitim, Mapper und Query bspw. über eine Factory zu erzeugen und die Query in ein eigenes Objekt auszulagern.
Welchen Vorteil versprichst du dir davon, den Query in ein eigenes Objekt auszulagern?

Zitat:
Zitat von nikosch Beitrag anzeigen
Nö, tust Du nicht.
In den obigen Beispielen nicht, richtig. Ich hatte aber geschrieben, dass ich es ändern werde, was mittlerweile erfolgt ist

Zitat:
Zitat von nikosch Beitrag anzeigen
man muss nicht die Datenbankconnection immer im Objekt vorhalten
Hier stimme ich dir zu. Allerdings benötigt nahezu jede Methode in der Mapper-Klasse die DB-Verbindung.
Trainmaster ist offline   Mit Zitat antworten
Alt 06.07.2011, 17:57  
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:
Welchen Vorteil versprichst du dir davon, den Query in ein eigenes Objekt auszulagern?
1. Ordnung und Übersicht
- eine Aufgabe pro Objekt
2. Wiederverwendbarkeit
- der Query in anderen Mappern,
- des Mappers mit einer verbesserten Query
3. Erweiterbarkeit
- des Mappers durch Ableitung ohne Kopieren oder Ändern des Querycodes
- der Query ohne Anfassen des Mappercodes
__________________
--
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 07.07.2011, 13:19  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Ich habe das eine Weile so gehandhabt verschiedene Methoden zum Selektieren nach verschiedenen Kriterien bereitzustellen. Damit war ich aber auf Dauer nicht zufrieden, ist mir auf Dauer zuviel Wartungsaufwand wenn mal neue Felder nach denen selektiert wird dazu kommen oder wegfallen.

Momentan bin ich da am rumprobieren und basteln, momentan sieht das im Groben so aus:
PHP-Code:
<?php
abstract class Base_Repository {
    protected 
$db;
    protected 
$table;
    protected 
$pkField;
    protected 
$modelClass;
    protected 
$properties = array();
    protected 
$lazySave   = array();
    protected 
$cache      = array();
    protected 
$cachedAll  false;
    protected 
$statement  null;

    public static function 
factory(mysqli $db,$table,$pkField,$modelClass) {}
    public function 
__construct(mysqli $db,$table,$pkField,$modelClass) {}
    public function 
__destruct() {}
    public function 
__get($property) {}
    public function 
__call($name$arguments) {}
    public function 
setTable($table) {}
    public function 
setPkField($pkField) {}
    public function 
setModelClass($modelClass) {}
    public function 
setProperty(Base_Property $property) {}
    public function 
setProperties(array $properties) {}
    public function 
getProperty($property) {}
    public function 
getProperties() {}
    public function 
hasProperty($property) {}
    public function 
create(array $data,$lazySave=true) {}
    public function 
save($object,$lazySave=true) {}
    public function 
find($columns=null) {}
    public function 
orderBy($column,$direction="ASC") {}
    public function 
limit($count,$offset=0) {}
    public function 
delete($object) {}
    public function 
saveAll(array $objects) {}
}

abstract class 
Base_Model {
    protected 
$properties = array();
    
    public function 
injectProperties(array $properties) {}
    public function &
__get($property) {}
    public function 
__set($property,$value) {}
    public function 
as_array() {}
    public function 
as_json() {}
}

class 
Select_Statement {
    protected 
$validDirections = array("ASC","DESC");
    protected 
$repository;
    protected 
$queryString;
    protected 
$columns;
    protected 
$conditions     = array();
    protected 
$bindValues     = array("");
    protected 
$orderByColumn  null;
    protected 
$orderDirection null;
    protected 
$limitCount     null;
    protected 
$limitOffset    null;

    public function 
__construct(Base_Repository $repository,array $columns=null) {}
    public function 
addCondition(Base_Condition $condition) {}
    public function 
build() {}
    public function 
query() {}
    public function 
pk($value) {}
    public function 
all() {}
    public function 
filter() {}
    public function 
orderBy($column,$direction="ASC") {}
    public function 
limit($count,$offset=0) {}
}

class 
Base_Condition {
    protected 
$repository;
    protected 
$property;
    protected 
$condition;
    protected 
$value;
    
    public function 
__construct(Base_Repository $repository,Base_Property $property) {}
    public function &
__get($property) {}
    public function  
__toString() {}
    public function 
eq($value) {}
    public function 
neq($value) {}
    public function 
gt($value) {}
    public function 
lt($value) {}
    public function 
like($value) {}
    public function 
_and() {}
    public function 
_or() {}
    public function 
_xor() {}
}
Verwendung sieht dann beispielsweise so aus:
PHP-Code:
$db = new mysqli("localhost","root","","tests");

class 
User_Repository extends Base_Repository {
    public function 
__construct(mysqli $db) {
        
parent::__construct($db,"user","id","User_Model");
        
$this->setProperty(new Base_Property("id","i",null));
        
$this->setProperty(new Base_Property("name","s",null,"string",3,30));
        
$this->setProperty(new Base_Property("email","s",null,"email"));
        
$this->setProperty(new Base_Property("language","s","de-DE","string",5,5));
        
$this->setProperty(new Base_Property("customer_id","i",0,"int"));
    }
}
class 
User_Model extends Base_Model {}


$User = new User_Repository($db);
// Komplette Userliste holen
$User->find()->all();
// Den ersten User bei aufsteigender Sortierung nach Name
$User->find()->filter($User->orderBy("name","asc")->limit(1));
// Namen und Email aller User zu customer 23 holen
$columns = array("name","email");
$User->find($columns)->filter($User->customer_id()->eq(23));
// User mit der id 42 holen
$User->find()->pk(42);
// Alle User mit Spracheinstellung de-DE und Name beginnend mit a holen
$User->find()->filter(
                
$User
                    
->language()->eq("de-DE")
                    ->
_and()
                    ->
name()->like("a%")
);
// Prüfen ob eine Email-Adresse bereits vergeben ist
count$User->find()->filter$User->email()->eq($email) ) ); 
Das macht die Nutzung für einfache Queries schon recht komfortabel.
Gebaut habe ich mir das Ganze erstmal mehr oder weniger aus Spaß und will es auch noch weiter ausbauen.
Generell ist es aber wohl sinnvoller gleich auf ein fertiges - und bewährtes - ORM zu setzen, wenn man das ganze so weit abstrahiert haben möchte.
SinnlosS ist offline   Mit Zitat antworten
Alt 07.07.2011, 13:33  
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

Was mir gerade auffällt:
Entweder Camel-Case _oder_ Unterstrich
in und not fehlt bei der Condition
xm22 ist offline   Mit Zitat antworten
Alt 07.07.2011, 13:43  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von xm22 Beitrag anzeigen
Was mir gerade auffällt:
Entweder Camel-Case _oder_ Unterstrich
in und not fehlt bei der Condition
Stimmt, da hast du Recht.
Bei den Conditions fehlt auch noch mehr denke ich. Spontan fallen mir z.B. noch gte (>=) und lte (<=) ein.
SinnlosS 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
Klasse mit Pfadproblem Dieselsepp PHP Einsteiger 6 27.04.2011 13:51
Seite nur im Script aufrufbar BlackScorp PHP Tipps 2010 4 03.11.2010 15:57
[Erledigt] Klasse aus einer anderen Klasse aufrufen Tobby PHP-Fortgeschrittene 7 14.07.2010 20:05
[Erledigt] Nur einer bestimmten Klasse Zugriff andere Klasse erlauben Turamisi Software-Design 2 20.02.2010 20:31
[Erledigt] variable außerhalb einer klasse definieren - &quot;var $variable&quot; in klasse not taurus PHP Tipps 2009 14 05.12.2009 16:00
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Eine klasse einbinden newWorldOrder PHP Tipps 2009 2 23.02.2009 19:32
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Klasse aus externer Klasse aufrufen kostja PHP Tipps 2008 8 07.08.2008 14:13
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mapperklasse

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