Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Scope bei Klassen

Einklappen

Neue Werbung 2019

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

  • #16
    Ich habe seit Stunden getestet und getan. Ich glaube, den Ursprung des Fehlers entdeckt zu haben. Zumindest weiß ich jetzt, dass der Fehler darin liegt, dass ich nicht weiß, wie die View mit dem Controller kommunizieren soll. Meine View wird ja in der Form-Klasse mit include eingefügt.

    class Form
    PHP-Code:
        public function __construct()
        {
            
    $this->validator Registry::getInstance()->validator;
            include 
    $this->form;
        } 
    Und so lange die Inputfelder nicht korrekt ausgefüllt sind, wird sie ja immer wieder neu eingefügt.

    Ich dachte, dass die Registry als globaler Container einen aktuellen Zustand wiedergibt. Das heißt, dass wenn in der View auf ein Objekt im Registry-Container zugegriffen wird, dass es dann automatisch den aktuellen Zustand mit den neuzugewiesenen Variablen wiedergibt. Aber das tut es nicht. Ich weiß also nicht, wo ich den Zustand nach der Validierung zwischenspeichern soll, damit es sich die View holen kann, dass die View also weiß "hey, ich werde zum 2. mal aufgerufen, nach der action gab es Fehler, jetzt diese ausgeben".

    Der Knackpunkt scheint die Methode $form->isValid() zu sein. Die Zuweisung der Errors dort am Ende findet aus irgendeinem Grund nicht statt.
    PHP-Code:
        public function isValid($request)
        {
            foreach(
    $request as $key => $value) {

                
    // bei fehlerhafter Eingabe, $this->errors befüllen.
            
    }
            if(
    null !== $this->errors) {
                
    // hier sollte sich Zustand ändern, tut es aber nicht
                
    Registry::getInstance()->validator->setErrors($this->errors);
                return 
    false;
            }
            return 
    true;
        } 

    Kommentar


    • #17
      Dein Formular ist nicht dafuer zustaendig einen include durchzufuehren. Was nun die validator in der Registry mit dem Form zu tun haben, verstehe ich auch nicht. Deinem Formular *und* deinen Formularelementen kannst du explizit Validator zuweisen. Die musst und sollst du aber nicht aus der Registry holen, sondern explizit festlegen fuer dieses Feld. Alternativ kannst du es auch aus einem ORM-aenhlichen Konstrukt beziehen.

      Sieht alles etwas wie beim Zend Framework aus, nur eben im letzten Zug falsch.
      "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

      Kommentar


      • #18
        der Ablauf ist falsch und widerspricht dem EVA-Prinzip:
        1 --> RegistrationController ruft new RegistrationForm auf
        2 --> RegistrationForm includiert eine FormularView, prüft bei action die Angaben
        3 --> Ist Prüfung korrekt, dann speichere und ShowNewUserView.php weiterleiten.. ansonsten nochmal FormularView ausgegeben.
        1 --> (Front-)Controller entscheidet, daß der RegistrationController ran muß (anhand übergebener Parameter und/oder URL)
        2 --> RegistrationController prüft ob das Formular abgesandt wurde
        -> wenn nein: FormularView erzeugen lassen und ausgegeben. ($view = new View('Form'); $view->Display(); )
        -> wenn ja: Formular validieren (extra Klasse oder in Controller integriert)
        und je nach Ergebnis FormularView erzeugen lassen und ausgegeben
        oder SuccessView erzeugen lassen und ausgegeben.
        Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

        Kommentar


        • #19
          Zitat von Chriz Beitrag anzeigen
          Deinem Formular *und* deinen Formularelementen kannst du explizit Validator zuweisen. Die musst und sollst du aber nicht aus der Registry holen
          Chriz, die Validationsmethoden wurden für dieses Formular ja explizit Feld für Feld festgelegt. Nachdem die $_POST-Dateien abgeschickt worden sind, findet ja eine Prüfung durch die Klasse RegistrationForm, welche von der Klasse Form abgeleitet wurde, in der Methode isValid() statt. In isValid() wird auf das Objekt Validator, dass in der Registry abgelegt wurde, zurückgegriffen und bei falscher Eingabe die Fehlermeldung in der Methode Registry::getInstance()->validator->setErrors() reingeschrieben. Und da die Registry ja als globaler Container agiert, dachte ich, dass ich in der View, die zum 2. mal aufgerufen wird, weil die Eingaben ja nicht korrekt waren, auf den aktuellen Zustand des Objekts Validator in der Registry (Es wurden ja die Fehlermeldungen reingeschrieben in das Objekt Validator) zugreifen kann und Sie einfach ausgeben lassen kann.

          Zitat von Chriz Beitrag anzeigen
          Sieht alles etwas wie beim Zend Framework aus
          Das stimmt schon, ich habe ja geschrieben, dass ich mich von den Beispielen im Netz habe inspirieren lassen.

          Zitat von Koala Beitrag anzeigen
          -> wenn ja: Formular validieren (extra Klasse oder in Controller integriert)
          und je nach Ergebnis FormularView erzeugen lassen und ausgegeben
          oder SuccessView erzeugen lassen und ausgegeben.
          Gut, woher soll FormularView sich aber jetzt die Fehlermeldungen holen, nach dem die Validation Fehler in der Eingabe entdeckt hat? Wie soll ich also dem Formular sagen, dass es zum 2. mal ausgegeben wird und diese und jene Felder diesen und jenen Fehler erzeugt haben? Das ist für mich ja das große Rätsel,wie ich den Controller, der ja Fehler entdeckt hat, mit der View kommunizieren lasse.

          Kommentar


          • #20
            wie ich den Controller, der ja Fehler entdeckt hat, mit der View kommunizieren lasse.
            Du kannst z.B. dem Konstruktor nen Parameter Output oder Error mitgegeben.
            Ich zeig die Fehler immer oberhalb des Formulars an: "Es sind Fehler aufgetreten: Vorname, Name, PLZ ...".

            Ich weiß ja nicht wie das bei Dir aussehen soll.

            Gut, woher soll FormularView sich aber jetzt die Fehlermeldungen holen
            Seit wann holt die View Daten ??? Die View ist dumm, sie weiß gar nix (von ein bißchen Designlogik abgesehn), sondern kriegt den Namen des html-Template
            und die darzustellenden Variableninhalte geliefert.

            Bei einer erneuten Ausgabe bereits geprüfter richtiger Feldinhalte,
            speichre ich diese in einem Session-Array, z.B. in $_SESSION['reg'] bei ner Registrierung.

            Der View-Konstruktor kriegt also drei Parameter mit:

            $view = new View('templatename', 'sessionarray', 'errorstring');

            Für die Validierung hab ich ne extra Klasse die die Namen der Pflichtfelder übergeben bekommt
            und z.B. $_SESSION['reg']['name'] bei erfolgreicher Vailiderung mit dem eingegebenen Inhalt füllt
            und bei fehlgeschlagener Validierung leert: $_SESSION['reg']['name'] = '';

            Überleg Dir mal wie man es prozedural macht: EVA-Prinzip, Affenformular.

            Dürfte nicht so schwer sein.
            Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

            Kommentar


            • #21
              Ich habe es dadurch gelöst, dass ich eine View-Klasse erstellt habe und die Fehlermeldungen nach der Validierung von der Form-Klasse an die View-Klasse übergebe. Weiß nicht, ob das EVA-konform ist, aber es löst auf jeden Fall mein Problem.
              PHP-Code:
              class RegistrationController extends Controller
              {
                  public function 
              execute()
                  {
                      
              $view = new View('registration');

                      if(
              $this->request->issetPost()) {
                          
              $form = new RegistrationForm;
                          
              $posts $this->request->getPosts();
                          
                          if(
              $form->isValid($posts)) {
                              
              // [..save..]
                          
              }
                          else {
                              
              $view->errors($form->getErrors());
                          }
                      }
                      
              $view->display();
                  }

              Kommentar


              • #22
                Das ist gut gelöst.
                "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                Kommentar

                Lädt...
                X