Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zum MVC-Prinzip

Einklappen

Neue Werbung 2019

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

  • Frage zum MVC-Prinzip

    Hello World
    Ich hab jetzt schon seit den letzen paar Monaten mit dem MVC-Prinzip gearbeitet, allerdings frage ich mich manchmal, ob ich das Prinzip auch richtig verstanden habe
    Ist folgender "Gedankengang" am Beispiel eines "abgespeckten" CMS richtig?:

    Model:
    - getTitle, returnt "Startseite"
    - getText, returnt "Ich bin die Startseite"

    View:
    - printTitle($text), gibt $text in h2 aus
    - printText($text), gibt $text in einem Div aus

    Controller:
    $view->printTitle($model->getTitle);
    $view->printText($model->printText);

    Ich denke/hoffe, dass ihr euch etwas unter meinem Prinzip vorstellen könnt

    Vielen Dank für eure Antworten

    lg
    Lollix

  • #2
    Passt.

    Model liefert Daten, View gibt sie auch, Controller beliefert den View mit den Daten vom Model.

    Kommentar


    • #3
      Also ich kann mir unter deinem Prinzip nichts vorstellen, wie auch bei diesem sperlichen und an Informationen abgespeckten Post.

      Wie soll denn daraus jemand nachvollziehen können ob du das Prinzip vom MVC richtig verstanden hast? Im Bereich der Webentwicklung legt eh bei weiten jeder das MVC irgendwie anders aus und du knallst da ein paar Codefetzen hin?

      Überarbeite deinen Beitrag bitte und gib in Worten wieder was du wie verstanden hast und dann kann man daraus eine vernünftige Diskussion aufbauen, aber nicht so!

      Gruß Litter

      Kommentar


      • #4
        Erstmal danke für die Antwort.
        @litter: Das Model gibt die Daten im String-Format, rechnet alle Rechnungen u.ä. aus, der View gibt alles nur aus und "rechnet" sozusagen nur Designporbleme und der Controller macht nichts anderes als dem View die Daten aus dem Model zu geben... Ich hoffe, das war verständlicher (und richtig)

        @all: Jetzt hab ich nur noch ne Frage zum Ablauf im Controller:
        Kann ich dass einfach folgendermaßen schreiben, oder soll ich dafür ne extra Klasse mit diversen Methoden zum Aufruf machen, also entweder Option 1:
        PHP-Code:
        <?php
        //Mit require_once Dateien laden

        class controller{
        private 
        $model;
        private 
        $view;
        function 
        __construct () {
           
        $this->model = new model();
           
        $this->view = new view();
           
        $view->printTitle($model->getTitle);
           
        $view->printText($model->printText);
        }
        }

        $ctrl = new controller();
        ?>
        oder option 2:
        PHP-Code:
        <?php
        //Mit require_once Dateien laden

        class controller{
        private 
        $model;
        private 
        $view;
        function 
        __construct () {
           
        $this->model = new model();
           
        $this->view = new view();


        }
        public function 
        text () {
           
        $view->printText($model->printText);
        }
        public function 
        Title () {
           
        $view->printTitle($model->getTitle);
        }
        }

        $ctrl = new controller();
        $ctrl->Title();
        $ctrl->Text();
        ?>
        Kann sein, dass irgendwo ein Fehler liegt, { zu viel/wenig, soll nur das prinzip zeigen

        Danke
        lg
        Lollix

        Kommentar


        • #5
          Das Model muss nicht unbedingt "model" heißen. Es kann ein beliebiger Name sein. Es muss nur irgendwelche Daten liefern oder dafür sorgen, dass sie gespeichert werden.

          Ich habe es zwar noch nicht gemacht, aber als nächstes werde ich folgendes versuchen:

          PHP-Code:
          class User
          {
             public 
          $name// nur deshalb public, weil ich mir hier die getter/setter ersparen will
          }

          class 
          Dal // Schnittstelle z. B. zur Datenbank
          {
             public function 
          getUsers()
             {
                
          // ...
             
          }
             public function 
          getUser($id)
             {
                
          // ...
                
          $data $db->fetch('SELECT id, name FROM user WHERE id='.$id.';');
                
          $user = new User();
                
          // ...
                
          return $user;
             }
             public function 
          saveUser(User $user)
             {
                
          // ...
             
          }
          }

          class 
          View
          {
             
          // ...

          Und so eine typische Controller-Klasse gibt es bei mir eigentlich nicht.

          Was ich anders mache als andere Programmierer, ist, dass hier die Klasse 'User' vom Model unabhängig ist. Damit bleibe ich flexibel.

          Sollte die Dal-Klasse zu umfangreich werden, kann man auch mehrere Klassen daraus machen. Z. B.:

          PHP-Code:
          class DalUser
          {
             
          // ...
          }

          class 
          DalTopic
          {
             
          // ...
          }

          // ... 

          Kommentar


          • #6
            Das Model gibt die Daten im String-Format
            Nein, nicht unbedingt. 99% der Methoden in meinen Models geben Arrays oder Objekte zurück.
            Deshalb tendiere ich bei deinem Beispiel auch eher zu getPage() welches ein Array mit Titel, Text etc zurückgibt.

            Kommentar


            • #7
              Zitat von coola Beitrag anzeigen
              Das Model muss nicht unbedingt "model" heißen. Es kann ein beliebiger Name sein. Es muss nur irgendwelche Daten liefern oder dafür sorgen, dass sie gespeichert werden.

              Ich habe es zwar noch nicht gemacht, aber als nächstes werde ich folgendes versuchen:

              PHP-Code:
              class User
              {
                 public 
              $name// nur deshalb public, weil ich mir hier die getter/setter ersparen will
              }

              class 
              Dal // Schnittstelle z. B. zur Datenbank
              {
                 public function 
              getUsers()
                 {
                    
              // ...
                 
              }
                 public function 
              getUser($id)
                 {
                    
              // ...
                    
              $data $db->fetch('SELECT id, name FROM user WHERE id='.$id.';');
                    
              $user = new User();
                    
              // ...
                    
              return $user;
                 }
                 public function 
              saveUser(User $user)
                 {
                    
              // ...
                 
              }
              }

              class 
              View
              {
                 
              // ...

              Und so eine typische Controller-Klasse gibt es bei mir eigentlich nicht.

              Was ich anders mache als andere Programmierer, ist, dass hier die Klasse 'User' vom Model unabhängig ist. Damit bleibe ich flexibel.

              Sollte die Dal-Klasse zu umfangreich werden, kann man auch mehrere Klassen daraus machen. Z. B.:

              PHP-Code:
              class DalUser
              {
                 
              // ...
              }

              class 
              DalTopic
              {
                 
              // ...
              }

              // ... 
              Da fällt mir nur WTF ein!?
              Offenbar hast du 0 Ahnung davon. IMHO solltest du dir das ganze nochmal durchlesen, bevor du versuchst, anderen deinen "Schwachsinn" näher zu bringen.

              Kommentar


              • #8
                Ich habe es noch nicht ausprobiert. Es ist etwas ausgefallen. Ist nicht das, was sich teilweise eingebürgert hat. Aber ich werde dieses Prinzip beim nächsten Projekt ausprobieren. Dadurch, dass die Klasse 'User' nicht an den Data-Access-Layer gebunden ist, erhoffe ich mir mehr Flexibilität.

                Kommentar


                • #9
                  PHP-Code:
                  $ctrl = new controller();
                  $ctrl->Title();
                  $ctrl->Text(); 
                  MVC ist wohl eher so angelegt:

                  PHP-Code:
                  $view $ctrl->getView();

                  $view->showContent(); 
                  Das macht schon deshalb Sinn, weil Du auch die Information „Gesamtansicht besteht aus Titel und dann Text“ in der View halten kann. Die ist die Ausgabekomponente! Bei Dir wird das durch die Reihenfolge der Methodenaufrufe bestimmt.
                  Zudem ist es Unsinn, für alle Viewausgaben zusätzliche Wrappermethoden im Controller zu schaffen, wenn ich dazu auch die View selbst ansprechen kann.

                  PHP-Code:
                  function __construct () {
                     
                  $this->model = new model();
                     
                  $this->view = new view();

                  Auch recht unsinnig. Parameterlose Models und Views wirst Du nur in ganz einfachen Anwendungsfällen haben. Also am besten gelich DI angewöhnen:

                  PHP-Code:

                  $view  
                  = new myView ('foo');
                  $model = new myModel ('bar' $myDB);

                  $ctrl = new myController ($model $_GET["my_parameter"]);
                  $ctrl->setView ($view);

                  $ctrl->process ();

                  /// ...


                  // $view = $ctrl->getView(); // im Selben Kontext unnötig

                  $view->showContent(); 

                  Kommentar


                  • #10
                    Das Model gibt die Daten im String-Format, rechnet alle Rechnungen u.ä. aus, der View gibt alles nur aus und "rechnet" sozusagen nur Designporbleme und der Controller macht nichts anderes als dem View die Daten aus dem Model zu geben... I
                    nein - das Model "rechnet" nicht, sondern stellt nur die Daten bereit, der Controller "rechnet/verarbeitet die Daten aus dem Model, bereitet sie für die Ausgabe auf.
                    Die View "rechnet" überhaupt nicht, sondern beinhaltet im Normalfall nur die echos, ifs und foreach die für die Ausgabe gebraucht werden (Designlogik).

                    Kommentar


                    • #11
                      Naja Koala, das ist nicht genau definiert, wo die Businesslogik hingehört. Da gibt es verschiedene Ansätze.

                      Kommentar


                      • #12
                        So, erstmal danke für die ganzen Antworten, bei mir ist das Internet ausgefallen
                        @Koala: Ja, ich weiß, das war ja nur zum Spaß gemeint mit ausrechnen (view), was wo positioniert werden muss, weil ich das Wort rechnen schreiben wollte, weil ichs vorher auch verwendet hab. Beim Model wars ein falscher Gedanke von mir, danke
                        @nikosch: OK danke, allerdings waren die parameterlosen Models und so nur wie bereits gesagt: ein sehr, sehr simples Beispiel
                        @ragtek: Wen meintest du jetzt, mich oder coola?
                        @bitsnack: Danke, also Arrays sind dann effektiver, macht ja auch eigentlich Sinn

                        Danke euch allen für die Antworten

                        lg
                        Lollix

                        Kommentar


                        • #13
                          Zitat von ragtek Beitrag anzeigen
                          Da fällt mir nur WTF ein!?
                          Offenbar hast du 0 Ahnung davon. IMHO solltest du dir das ganze nochmal durchlesen, bevor du versuchst, anderen deinen "Schwachsinn" näher zu bringen.
                          Vielleicht untermauerst du das ganze noch mit irgendwelchen Argumenten?
                          Das ist doch für einen ersten Ansatz garnicht schlecht...jedenfalls halte ich "Schwachsinn" für ein extrem übertriebenes Urteil. Um es mal mit deinen Worten zu sagen: "Offenbar hast du 0 Ahnung davon, IMHO solltest du dir das ganze nochmal durchdenken bevor du anderer Leute Code für Schwachsinn erklärst"

                          (das es am Thema "MVC" etwas vorbeigeht ist klar....)

                          Kommentar


                          • #14
                            allerdings waren die parameterlosen Models und so nur wie bereits gesagt: ein sehr, sehr simples Beispiel
                            Mir geht es um das DI Pattern. Sonst endet man nämlich schnell bei dieser Diskussion: http://www.php.de/php-einsteiger/749...-patterns.html (ab #11). Vor allem das Model im Controller zu erzeugen, dürfte bei den wenigsten Anwendungen sinnhaltig sein. Da kannste Dir MVC dann auch schon fast sparen.

                            Kommentar


                            • #15
                              Ok, irgendwie verstehe ichs jetzt ja, aber nur irgendwie
                              Ich hab jetzt die 3 Dateien.
                              1. Sollen alles eigene Klassen sein?
                              2. Wie kommunizieren sie miteinander?

                              Kommentar

                              Lädt...
                              X