| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

24-06-2009, 16:28
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Validierungen über eine Klasse
Hallo.
Ich eröffne kurz einen neuen Thread, weil er eher nicht zum vorherigen passt.
Ich habe mich über OOP informiert und wollte bei euch einmal "anfragen",
wie Ihr eine Validierung zusammenfasst.
Eine einzelne Validierung ist kein Problem.
Wenn jedoch mehrere Validierungen durchgeführt und die evtl. Fehlermeldungen zusammen ausgegeben werden.
Wie setze ich die Klassen dann am besten ein?
Eine Hauptklasse, z.B. allgemeine_validierung
welche ein neues Objekt als Parameter mitbekommt,
dieses Objekt zur Prüfung nutzt und die evtl. Fehlermeldung des Objektes bzw. der mehreren Objekte in der allgemeinen_validerung Klasse zusammenfügt und gemeinsam ausgibt.
Dann werden die direkten Prüfungsklassen extends allgemeine_validierung bezogen programmiert.
Jedoch, wie soll die allgemeine_validierung die Fehlermeldungen speichern?
Einfach in einer Array?
Oder jedes Objekt nochmals durchlaufen und ausgeben?
Danke
|

24-06-2009, 16:55
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Ich hoffe, jemand versteht meine Beweggründe
Ein Beispiel woran ich gerade bastel (funktioniert nur noch nicht, warum auch immer  )
PHP-Code:
<?php
class validierung { var $error_msg;
function validierung() { $this->error_msg = array(); }
function validierung_string($object, $error_msg) { if($object == false) { echo $error_msg; } else { echo "TRUE"; } } }
class lenght_min_max extends validierung { var $mystring; var $min_lenght; var $max_lenght;
function lenght_min_max($mystring, $min_lenght, $max_lenght) { $this->mystring = $mystring; $this->min_lenght = $min_lenght; $this->max_lenght = $max_lenght;
return $this->check(); }
function check() { $mystring = trim($this->mystring); return strlen($mystring) >= $this->min_lenght && strlen($mystring) <= $this->max_lenght; } }
$prüfung = new validierung;
$prüfung->validierung_string(new lenght_min_max("Eigentlich True", 2, 30), "Der Wert liegt nicht zwischen 2 und 30"); ?>
|

24-06-2009, 17:04
|
|
|
Üblicherweise speichert man (zumindest Ich mache das idr. so) die Fehler in einem Array.
Beim mehrsprachigen Fehlern sollte man allgemeine und eindeutige Bezeichner benutzen die dann in eine Fehlermeldung der entsprechenden Sprache umgesetzt werden.
Als simples Beispiel:
PHP-Code:
// --> Einsprachig $errors = array(); if ($var == "doof") { $errors[] = "Die Variable ist doof!"; } if (!empty($errors)) { // Fehler sind aufgetreten $errors_text = "- ".implode("<br>- ", $errors); }
// --> Multilingual $errors = array(); if ($var == "doof") { $errors[] = "ERR_VAR_DOOF"; } if (!empty($errors)) { // Fehler sind aufgetreten $errors_text = "- ".implode("<br>- ", get_error_strings($errors, $language)); }
Wie du das in deine Klasse bekommst weisst du hoffe ich selber 
Ich hoffe das Hilft dir. Schönen Feierabend wünsche ich
mfg Jens
|

24-06-2009, 17:07
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Dankeschön.
Nur wollte ich nicht wieder mit den Arrays anfangen und dort alles verzeichnen.
Oder ist das in diesem Fall gestattet?
Wenn die Klassen schon so dynamisch funktionieren und allgemein einsetzbar sind, dann kam mir eine Speicherung der Fehler in eine Array zur gemeinsamen Ausgabe etwas "..." vor !?
Dazu: (Ist die Klasse so ok? Oder ist die Return Methode nicht angebracht in dem Stil?)
PHP-Code:
<?php
class validierung { var $error_msg;
function validierung() { $this->error_msg = array(); }
function validierung_string($object, $error_msg) { if($object->error == false) { echo $error_msg; } else { echo "Alles ok"; } } }
class lenght_min_max { var $mystring; var $min_lenght; var $max_lenght; var $error;
function lenght_min_max($mystring, $min_lenght, $max_lenght) { $this->mystring = $mystring; $this->min_lenght = $min_lenght; $this->max_lenght = $max_lenght; $this->error = $this->check();
}
function check() { $mystring = trim($this->mystring); return strlen($mystring) >= $this->min_lenght && strlen($mystring) <= $this->max_lenght; } }
$prüfung = new validierung;
$prüfung->validierung_string(new lenght_min_max("Müsste True sein", 2, 30), "Der Wert liegt nicht zwischen 2 und 30"); ?>
|

24-06-2009, 17:11
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Schau dir doch mal die Validierungsklassen des Zend Frameworks an. Die haben ein Interface für eine Validierungsklasse, gegen dass die konkreten Klassen geschrieben werden. Die Fehlermeldungen pro Validierung werden zunächst in der entsprechenden Validierungsinstanz gespeichert. Eine übergeordnete Klasse stapft dann über die Validierungen und fragt nach Fehlern.
Ein Beispiel: Eine Validierung kann mehrere Fehlermeldungen produzieren. Ein Passwort zum Beispiel kann gegen eine Mindestlänge nicht erreichen und zu wenig Sonderzeichen beinhalten. Trotzdem wird man sich bequemerweise eine Passwort-Validierungsklasse bauen (die evtl. wieder weitere Validierungen zu rate zieht, aber davon muss die "Außenwelt" nicht wissen).
Einer Validierungsklasse allerdings eine Ableitung von sich selbst zu übergeben ist eher ungeschickt. Eigentlich bringt die Ableitung ja alles mit, was sie können muss –*oder sollte es jedenfalls.
|

25-06-2009, 00:24
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Ich finde es persönlich in meiner Anfangsphase den Wechsel
von der Redundanz zu Klassen äußerst schwierig,
da ich mir nie sicher bin, was ich nun in eine Klasse schreiben,
oder lieber doch redundant code.
Erfahrung?
Ich sehe viele Projekte in welchen SourceCodes einfach fast alles in
Klassen gewürfelt wird und in anderen nur in funktionen.
|

25-06-2009, 00:37
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Wenn du merkst, dass du ein paar Zeilen Code schonmal geschrieben hast, dann musst du "refaktorieren". Und das darf man nie aufschieben, dass muss man sofort machen. Konkret musst du an dieser Stelle dafür sorgen, dass der Code nur einmal vorkommt (und nicht das Anti Pattern des Duplicate Codes erfüllt).
Deswegen vererbt man Klassen auch nicht wild durch die Gegend sondern baut eine Hierarchie auf. Generelle Projekt/Framework-Klasse -> Abstrakte Validierungsklasse -> Konkrete Validierungsklasse -> Spezielle Validierungsklasse
Das funktioniert natürlich nicht mehr, wenn man auf ein externes Framework o.ä. aufsetzt, aber prinzipiell macht man es da genau so.
Was "funktional" oder "objektorientiert" angeht: Entscheide dich für eines. Ein Misch Masch führt alle Beteiligten früher oder später in den Wahnsinn.
Edit: Und jetzt guck dir die ZF-Validierungsklassen an!
Geändert von unset (25-06-2009 um 00:40 Uhr)
|

25-06-2009, 00:38
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Mich verwirrt dein Gebrauch des Wortes Redundanz. Klingt als wäre es für dich das Gegenteil von oder eine Alternative zur Objektorientierung. Ist es aber nicht.
Meinst du vielleicht prozedurale Programmierung (= alles in Funktionen, keine Klassen)?
|

25-06-2009, 01:33
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Zitat:
Zitat von onemorenerd
Mich verwirrt dein Gebrauch des Wortes Redundanz. Klingt als wäre es für dich das Gegenteil von oder eine Alternative zur Objektorientierung. Ist es aber nicht.
Meinst du vielleicht prozedurale Programmierung (= alles in Funktionen, keine Klassen)?
|
Ja. Tut mir leid. Natürlich meine ich prozedural
Ist schon spät und kam vorhin ausm Kino.
|

27-06-2009, 16:01
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Ist es ok, eine SQL Abfrage durchführen zu lassen aufgrund von
variablen Daten, welcher der Klasse gegeben werden?
Sprich, der SQL Klasse können beliebige Werte gegeben werden,
die Klasse setzt diese übergebenen werte zu einer query zusammen und fragt sie ab.
So braucht man nicht immer eine query schreiben sondern der klasse
nur sagen welche spalten man braucht und die query wird wie gesagt selbst zusammen gesetzt, abgefragt und das ergebnis zurückgegeben.
Eher eine schlechte Idee?
|

27-06-2009, 16:11
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
Zitat:
Zitat von phpMorpheus2
Ist es ok, eine SQL Abfrage durchführen zu lassen aufgrund von
variablen Daten, welcher der Klasse gegeben werden?
Sprich, der SQL Klasse können beliebige Werte gegeben werden,
die Klasse setzt diese übergebenen werte zu einer query zusammen und fragt sie ab.
So braucht man nicht immer eine query schreiben sondern der klasse
nur sagen welche spalten man braucht und die query wird wie gesagt selbst zusammen gesetzt, abgefragt und das ergebnis zurückgegeben.
Eher eine schlechte Idee?
|
Kommt darauf an, wie komplex die Querries werden können. Es gibt aber einige Frameworks, bei denen das so gemacht wird. Imho allerdings nicht direkt in der Datenbankklasse, sondern über eine weitere Klasse, die als Abstraktionsschicht dient.
Und wenn du das auch noch Datenbankübergreifend machen willst, dann schau dir mal Doctrine oder Propel an.
Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

27-06-2009, 16:24
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Mach dich mal über das Prinzip eines DAO schlau. Ich glaube fast, das ist das, was du suchst.
|

27-06-2009, 16:28
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Danke
Was würde eine Hilflose Seele wie ich bloß ohne Euch Profis machen
|

27-06-2009, 16:36
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
Zitat:
Zitat von phpMorpheus2
Danke
Was würde eine Hilflose Seele wie ich bloß ohne Euch Profis machen 
|
Woanders deine Fragen stellen  .
Btw: Es gibt beim DAO ein Art von Grundschema. Zuerst modellierst du den Datenzugriff über ein Interface. Darauf baut dann eine abstrake Klasse für allgemeine Zugriffe auf Daten auf. Und darauf bauen dann konkrete Klassen auf, die von der Art des Zugriffs abhängen, also Datenbank, Textdatei, XML-Datei, SOAP-Daten oder sonst was.
Peter
EDIT: Außerdem solltest du langsam mal von der alten PHP4-Schreibweise abkommen.
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Geändert von Kropff (27-06-2009 um 16:41 Uhr)
|

27-06-2009, 17:15
|
|
phpMorpheus2
Registrierter Benutzer
|
|
Registriert seit: Apr 2007
Beiträge: 646
|
|
Zitat:
Zitat von Kropff
Woanders deine Fragen stellen  .
Btw: Es gibt beim DAO ein Art von Grundschema. Zuerst modellierst du den Datenzugriff über ein Interface. Darauf baut dann eine abstrake Klasse für allgemeine Zugriffe auf Daten auf. Und darauf bauen dann konkrete Klassen auf, die von der Art des Zugriffs abhängen, also Datenbank, Textdatei, XML-Datei, SOAP-Daten oder sonst was.
Peter
EDIT: Außerdem solltest du langsam mal von der alten PHP4-Schreibweise abkommen.
|
Klingt wie mein Projekt 
Wieso PHP4?
Was schriebe ich denn in PHP4
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|