Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie am besten Fehler zurückgeben?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wie am besten Fehler zurückgeben?

    Alles in allem ein kosmetisches Problem, dennoch hätte ich gerne Alternativen dafür. Ich möchte ein Framework aufbauen, welches darauf aufbaut viele Eingaben von Nutzern zu validieren und entsprechend Resonanz zurück zu geben.

    Am einfachen Beispiel eines einfachen (pseudo) Logins:
    PHP-Code:
    function authenticate($username$password) {
        
    $user getUser($username);

        if(!empty(
    $user) && $user'password' ] == $password)
            return 
    true;

        return 
    false;

    Die Art und Weise der Rückgabe über einen boolschen Wert finde ich am elegantesten, da einfach, verständlich und auf das wesentliche reduziert. Im Falle eines Fehlers habe ich aber keine Möglichkeit zu sagen, worin der Fehler besteht.

    Beispiel eines einfachen Logins mit Fehlerrückgabe:
    PHP-Code:
    function authenticate($username$password) {
        
    $user getUser($username);
        
    $error = array();

        if(!empty(
    $user)) {
            if(
    $user'password' ] != $password) {
                
    $error[] =  'Password Falsch';
            }
        } else {
            
    $error[] = 'Username nicht bekannt';
        }

        return 
    $error;

    Hier gibt es zwar die Möglichkeit konkret zu sagen, worin der Fehler besteht, aber es ist immer erforderlich abzufragen, ob das zurückgegebene Objekt leer ist oder nicht. Finde ich nicht wirklich schön und umständlich. Zudem gefällt mir der Gedanke nicht, das so viele Funktionen pauschal ein leeres Array zurückgeben.

    Alternativ könnte man alle Fehler in der Instanz speichern um sie dann Abzufragen:
    PHP-Code:
    function authenticate($username$password) {
        
    $user getUser($username);
        if(!empty(
    $user)) {
            if(
    $user'password' ] != $password)
                
    $this->addError('Passwort falsch');
        } else {
            
    $this->addError('Username nicht bekannt');
        }

        return 
    $this->hasErrors();

    PHP-Code:
    $success $authenticator->authenticate('username''pw);
    if(!$success) {
         $errors = $authenticator->getErrors();

    Diese Variante hat den Nachteil, dass unterschiedlichste Validierungen sich die "getError"-Methode teilen müssen, außer man schafft für jede Art der Validierung eine eigene Methode, wie z.B. getLoginErrors - aber dann leidet die Wartbarkeit und die Klasse wir unnötig aufgebläht.

  • #2
    Wie wäre es mit richtigem OOP und nicht so einer halbgaren Gülle? Exceptions sind so wie du sie verwendest nicht entworfen worden. Warum nicht einfach Exceptions werfen, so wie man sie eben verwendet?
    [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

    Kommentar


    • #3
      also im Kohana Framework wird eine ValidationException geschmissen mit einem array aus feld => regel

      als Beispiel
      PHP-Code:
      $all_rules = array(
      'username'=>array(
      array(
      'not_empty'),
      array(
      'min_lenght',6),
      etc..
      )
      );
      $validation = new Validation();
      foreach(
      $all_rules as $field => $rules){
      $validation->rules($field,$rules);
      }
      try{
      $validation->check();
      }catch(
      ValidationException $e){
      echo 
      $e->errors();
      }catch(
      Exception $e){
      echo 
      $e->errors();

      angenommen ich habe beim usernamen nur 5 buchstaben eingegebn so steht in errors dann
      PHP-Code:
      array('username'=>array('min_lenght'),
      'weitere felder mit regeln'); 
      so kann ich dann in meinem view mit den arrays machen was ich will, zb eigene error messages generieren und anzeigen

      als anregung

      https://github.com/kohana/core/blob/...Validation.php
      apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

      Kommentar


      • #4
        Zitat von ApoY2k Beitrag anzeigen
        Wie wäre es mit richtigem OOP und nicht so einer halbgaren Gülle? Exceptions sind so wie du sie verwendest nicht entworfen worden. Warum nicht einfach Exceptions werfen, so wie man sie eben verwendet?
        Wie bereits im Ausgangspost erwähnt, handelt es sich hier nur um Pseudocode, welcher die Frage verdeutlichen soll.

        Kommentar


        • #5
          Doppelpost

          Kommentar


          • #6
            Der Code von BlackScorp ist auch Pseudo, aber gescheit Objektorientiert aufgebaut.
            [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

            Kommentar


            • #7
              "Fehler". Ein falsches Passwort ist doch kein Fehler. Du solltest einen Unterschied machen zwischen unerwartetem Resultat und misslungenen "Hackversuchen". Im ersten Fall eigenen sich Exceptions und im zweiten Fall je nachdem, was du brauchst. Erwartest du ein Objekt, das aber aus irgendeinem Grund nicht erstellt werden soll: NULL. Ansonsten false für Booleans usw.
              Crashkurs zum Thema Rechtschreibung: [COLOR="Green"]normalerweise[/COLOR] ([COLOR="Red"]normaler weise[/COLOR] oder [COLOR="Red"]normaler weiße[/COLOR]), [COLOR="DarkGreen"]Standard[/COLOR] ([COLOR="Red"]Standart[/COLOR]), [COLOR="DarkGreen"]eben[/COLOR] ([COLOR="Red"]ebend[/COLOR])

              Kommentar


              • #8
                Also, es geht hier nicht darum, was hier als Container dient oder wie Fehler gespeichert werden, es geht lediglich um das Konzept, wie auf diese Fehler zurückgegriffen wird. Ob dies direkt über das Return-Statement passiert oder es einen anderen, sinnvollen Weg gibt, welcher eleganter und möglichst wenig Overhead erzeugt.

                Ein weiterer Versuch, es noch weiter runter zu brechen:
                PHP-Code:
                function authenticate($username$password) {
                    
                // Logic
                    
                    
                return array($success$error);

                PHP-Code:
                list($success$error) = $authenticator->authenticate($username$password); 
                Oder:
                PHP-Code:
                function authenticate($username$password) {
                    
                // Logic
                    
                    
                return $error;

                PHP-Code:
                $error $authenticator->authenticate($username$password);
                if(!empty(
                $error)) {
                   
                // Do Something

                Oder:
                PHP-Code:
                function authenticate($username$password) {
                    
                // Logic
                    
                    
                return $success;    

                PHP-Code:
                $success $authenticator->authenticate($username$password);
                if(!
                success) {
                   
                $success $authenticator->getErrors();

                Kommentar


                • #9
                  ein authentizierung sollte keine fehler geben, ledeglich true oder false

                  wenn du solche fehler wie "benutzername nicht gefunden" oder "passwort ist falsch" verwendest, erlaubst du angreifern zu validieren was sie genau falsch gemacht haben
                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                  Kommentar


                  • #10
                    BlackScorp hats dir doch schon hingeschrieben wie es läuft.
                    [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

                    Kommentar


                    • #11
                      https://github.com/kohana/orm/blob/3...th/ORM.php#L68

                      der einfache psuedologin von oben wärde völlig ausreichend
                      apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                      Kommentar


                      • #12
                        Ich finde nicht, dass Exceptions in einer Validierung was zu suchen haben. valid/invalid festzustellen ist doch die ganz normale Aufgabe eines solchen Moduls und auch ein entscheidbares Problem.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          nikosch ++
                          Bei den Exceptions sollte man sich m.E. an die wörtliche Übersetzung halten und diese nur in einer Ausnahmesituation werfen, sozusagen wenn es nicht mehr weiter geht.
                          Beispiel: Ich nutze in einer Klasse Sprachelemente, die erst ab Version 5.x verfügbar sind. Da erscheint es sinnvoll, wenn die Klasse mit PHP 4.x genutzt wird, bereits im Vorfeld eine Exception zu werfen.
                          PHP-Klassen auf [URL="https://github.com/jspit-de"]github[/URL]

                          Kommentar


                          • #14
                            Ich bin auch der Meinung, daß ein Validator keine Exceptions werfen sollte.

                            @Blackscorp
                            ein authentizierung sollte keine fehler geben, ledeglich true oder false
                            Das sehe ich anders. Eine fehlgeschlagene Authentifizierung ist eine kritische "Ausnahmesituation" und sollte eine Exception werfen. Selbst wenn diese nicht behandelt wird, führt das schlimmstenfalls zum sofortigen Script-Abbruch und verhindert dadurch schon mal Schlimmeres.

                            vg
                            jack
                            -

                            Kommentar


                            • #15
                              Eine fehlgeschlagene Authentifizierung ist eine kritische "Ausnahmesituation"
                              Sehe ich nicht so. Warum?
                              [COLOR="#F5F5FF"]--[/COLOR]
                              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                              [COLOR="#F5F5FF"]
                              --[/COLOR]

                              Kommentar

                              Lädt...
                              X