MVC - Erklärung/Beispiel?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MVC - Erklärung/Beispiel?

    So, Hey Leute nach langer Auszeit bin ich auch mal wieder in die Welt der Programmierer.

    Ich hab versucht das MVC prinzim zu verstehen. So lala hab ich das hinbekommen. Das ganze aber in die Tat umzusetzen da scheitere ich jedoch immernoch.
    Ich möchte keine Komplettlösung haben, aber wäre es möglich, dass mir jemand mal anhand eines Beispieles eine MVC beispiel-Lösung erstellt?

    Z.B. anhand etwas einfachen.:

    Quellcode

    1. $sql = $db->query("SELECT a FROM b"); // enthält z.b. 20 datensätze
    2. while($res = $db->fetch_array($sql)) {
    3. $wert1 =$res['wert1'];
    4. $wert2 =$res['wert2'];
    5. if($wert1!=$wert2){
    6. echo "<div class=\"line\"><h2>$wert1</h2></div>";
    7. }
    8. }


    Das ganze muss ja jetzt irgendwie auf das Model/ den View und den Controller aufgeteilt werden.
    Inspirieren lassen habe ich mich hier von : Klick


    Danke im Vorraus.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snowflake () aus folgendem Grund: Ergänzung

  • Wie stellst du dir das vor sollen wir nun für dich ein Framework schreiben?

    Für das MVC Schema brauchst du ein fertiges Grundgerüst das erst einmal Programmiert werden muß wenn du kein anderes Framework nutzen willst.
    Sowas zu Programmieren ist sehr viel Arbeit wenn man es in vernüftigen Rahmen macht und entuell dann auch für andere Projekte verwenden will.

    Mein Tip an dich schau dir erst mal ein fertiges Framework an das auf dem MVC Schema bassiert. Dabei wirste feststellen das viel mehr als nur MVC dazugehört.
    Unter anderem wirst du helper brauchen weiters einbindung von library und ein Modul bassiertes System were auch von Vorteil.

    Zum anschauen were das Zend Framework gut es ist zwar nicht leicht zu verstehen aber dabei kannst jede Menge lehrnen. Wenn du dir ein einfacheres leichters Framework anschauen möchtest dann
    Kohana (Nachfolger von codeigniter und passiert nun auch auf php5 )

    kohanaphp.de/home

    Model Beispiel für Zend Framework

    Quellcode

    1. <?php
    2. /**
    3. * @name Building.php
    4. *
    5. * @author splasch
    6. * @version 0.1
    7. * @copyright Copyright (c) 2009, Civitas Online
    8. */
    9. class Game_Model_City_Building extends Zend_Db_Table_Abstract
    10. {
    11. protected $_name = 'user_building';
    12. protected $_primary = array(
    13. 'fk_building_id',
    14. 'fk_user_id'
    15. );
    16. }
    Alles anzeigen


    Mfg Splasch
  • Im Grunde geht es immer nur um das Prinzip, dass die Code aufteilst, dass man nicht EINEN WULST an Code hat, sondern sinngemäß alles in 3 Teile aufteilt.

    Dem Model - Ist für die Datenbereitstellung zuständig. Also quasi, das Laden, Speicher und Bereitstellen von Daten.
    Der Controller - Ist quasi die Zentrale Instanz, die alles steuert, die mit den Daten aus dem Modell arbeitet und das ganze komponiert.
    Der View - Zeit die Daten dann an.

    Das ganze Konzept ist ehrlich gesagt etwas schwammig und natürlich sind verschiedene Frameworks, die nach dem Prinzip arbeiten auch ein wenig unterschiedlich. In der Regel interagiert der Nutzer aber nur mit dem Controller, auf die anderen Komponenten hat er normalerweise keinen Zugriff.

    Wenn man sich einen Bankautomat vorstellt.

    Ist der Bankautomat an sich der Controller. Wenn ich jetzt meinen Kontostand wissen will fragt er das Model: Hey, wie hoch ist denn der Kontostand von Konto x. Und das Ergebnis leitet er dann an das Display weiter, dass den Kontostand anzeigt, was dann der View ist.

    Um MVC anzuwenden brauchst du sogesehen an sich kein Fremework. Es handelt sich dabei eher um ein gedankliches Konstrukt, dass man mit Frameworks immer mehr einschränken kann, sich daran zu halten. Quasi könntest du so anfangen, dass die drei Ordner hast mit Model / View und Controller, um deinen Code aufzuteilen.
  • BennyBunny schrieb:

    Um MVC anzuwenden brauchst du sogesehen an sich kein Fremework. Es handelt sich dabei eher um ein gedankliches Konstrukt, dass man mit Frameworks immer mehr einschränken kann, sich daran zu halten. Quasi könntest du so anfangen, dass die drei Ordner hast mit Model / View und Controller, um deinen Code aufzuteilen.


    Genau dadrum ging es mir. Ich danke dir schonmal für die gute Erklärung. Auch mit dem Bankautomaten, die Idee war gut.
    Ich wollte von euch auch kein Framework geschrieben bekommen. In dem Beispiel was ich im ersten Beitrag hatte, die benutzen ja auch kein Framework.

    Ich wollte nur mal wissen wie ich das genau anstelle, alles passend aufzuteilen. Also z.b. wo kommt die SQL-Abfrage rein.. Ich denke mal dann in das Mode!? Der Controler startet die SQL-Abfrage und gibt es an den Viewer?

    Fraglich ist es mir leider, wie ich das ganze verbinde. Wie sende ich die Ergebnisse der SQL-Abfrage an den Viewer der mir das ausgibt..Wie starte ich das Model ect.
  • Wie du es drehst und wendest es bleibt trotzdem ein Framework auch wenn es nur sehr klein ist und nur die MVC Struktur dir zu verfügung stellt so wie oben in dem Beispiel.
    Dies kannst du gern auch unter de.wikipedia.org/wiki/Framework Nachlesen.

    Ich wollte nur mal wissen wie ich das genau anstelle, alles passend aufzuteilen. Also z.b. wo kommt die SQL-Abfrage rein.. Ich denke mal dann in das Mode!? Der Controler startet die SQL-Abfrage und gibt es an den Viewer?

    Fraglich ist es mir leider, wie ich das ganze verbinde. Wie sende ich die Ergebnisse der SQL-Abfrage an den Viewer der mir das ausgibt..Wie starte ich das Model ect.


    Zu deiner Frage (Sql):
    Für alle Daten abfragen ist der Modell bereich vorgesehen. Es gibt aber auch einige die das auch in den Controller bereich legen.

    Zu (Verbindung)
    Hier kommt nun das Grundgerüst zum tragen (Framework). Jedes davon besitzt mindesten eine Bootstrap datei über die dann alle weiteren aktionen gesteuert bzw geregelt werden.
    Diese startet zunächst mal den Controller. Díeser ist nun für die Steuerung des ganzen ablaufes zuständig und bestimmt welche Teile geladen werden sollen bwz holt sich die nötigen Elemente.
    Einer der Hauptaufgaben des Controller ist das Routing. Somit veranlast er bei bedarf das laden des richtigen Model teiles so wie den View Teil.

    Er muß nicht immer den Model teil laden dies bassiert nur dann wenn es von Controller aus angefordert wurde. Wenn wir nun ein bischen weiter gehen ist er auch zuständig für das Bereit stellen der Informationen die aus dem Model bereich kommen. Sowie das Laden der Module und der Libary. Dies ist ein komplexer vorgang der Anfangs nicht leicht zu verstehen ist. Dies alles über nihmt der Router bis auf die Dateninformation dies wird vom Regiestry übernohmen ist eine weitere Hauptfunktion des Controllers.

    Damit das ganze später auch funktioniert braucht du eine fix vorgebene Dateinamen und Klassennamen Struktur.Nur so ist es dem Router später möglich alle benötigten Teile zu finden und auch bei bedarf zu laden.

    Mfg Splasch
  • Also dein Code in MVC umgewandelt ohne groß ein Framework dahinter zu haben. Würde ich in etwas so beschrieben:

    Quellcode

    1. class MyModel {
    2. public function getMyData() {
    3. ...
    4. $sql = $db->query("SELECT a FROM b");
    5. return $db->fetch_array($sql); //Alles in den Speicher laden, nicht nur eine Zeile
    6. }
    7. }
    8. class MyView {
    9. public function render($data) {
    10. while($data) { //for each schleife über den array der daten iterieren
    11. $wert1 =$res['wert1'];
    12. $wert2 =$res['wert2'];
    13. if($wert1!=$wert2){
    14. echo "<div class=\"line\"><h2>$wert1</h2></div>";
    15. }
    16. }
    17. }
    18. }
    19. class MyController {
    20. public function run() {
    21. $model = new MyModel();
    22. $data = $model->getMyData();
    23. $view = new MyView();
    24. $view->render($data);
    25. }
    26. }
    Alles anzeigen


    Das ganz hat jetzt eher den charme von Pseudocode. Hab die Funktionen und Variablen nicht auf die neuen Gegebenheiten angepasst. ABer es geht ja hier auch nur um die "Theorie" ;)
  • splasch schrieb:

    Zu (Verbindung)
    Hier kommt nun das Grundgerüst zum tragen (Framework). Jedes davon besitzt mindesten eine Bootstrap datei über die dann alle weiteren aktionen gesteuert bzw geregelt werden.
    Diese startet zunächst mal den Controller. Díeser ist nun für die Steuerung des ganzen ablaufes zuständig und bestimmt welche Teile geladen werden sollen bwz holt sich die nötigen Elemente.
    Einer der Hauptaufgaben des Controller ist das Routing. Somit veranlast er bei bedarf das laden des richtigen Model teiles so wie den View Teil.

    Er muß nicht immer den Model teil laden dies bassiert nur dann wenn es von Controller aus angefordert wurde. Wenn wir nun ein bischen weiter gehen ist er auch zuständig für das Bereit stellen der Informationen die aus dem Model bereich kommen. Sowie das Laden der Module und der Libary. Dies ist ein komplexer vorgang der Anfangs nicht leicht zu verstehen ist. Dies alles über nihmt der Router bis auf die Dateninformation dies wird vom Regiestry übernohmen ist eine weitere Hauptfunktion des Controllers.

    Damit das ganze später auch funktioniert braucht du eine fix vorgebene Dateinamen und Klassennamen Struktur.Nur so ist es dem Router später möglich alle benötigten Teile zu finden und auch bei bedarf zu laden.


    Hi,

    das ist schon ein bischen überzogen. Wenn man davon ausgeht, dass man keine SEO Url´s nutzt, dann benötigt man nichtmal einen frontcontroller, ganz zu schweigen von einer registry oder irgendwelchen routing Einstellungen oder helpern ...

    BennyBunny hat das ganze ja schon ganz gut minimalistisch dargestellt, wobei ich mit dem view Part nicht so ganz zustimme, da mir da das eigentliche viewTemplate fehlt.

    Quellcode

    1. class MyView {
    2. $data = array();
    3. public function assign($key,$val){
    4. return $data[$key] = $val;
    5. }
    6. public function render($template) {
    7. $tpl = file_get_content($template);
    8. foreach($data as $key => $val) {
    9. $tpl = str_replace('#{' . $key , '}' ,$val,$tpl);
    10. }
    11. return $tpl;
    12. }
    13. }
    Alles anzeigen



    Quellcode

    1. class MyController {
    2. public function run() {
    3. $model = new MyModel();
    4. $data = $model->getMyData();
    5. $view = new MyView();
    6. $view->assign('Foo',$data->foo);
    7. $view->assign('Blubb',$data->blubblub);
    8. $view->render('user/profile.tpl');
    9. }
    10. }
    Alles anzeigen


    Template könnte so aussehen:

    Quellcode

    1. Lorem #{foo} Ipsum, <br /> irgendwas <b>#{blubb}</b>
  • Super dankeschön an euch alle. Besonders danke an BennyBunny und vince. Wie immer auf euch ist verlass.
    So eine Erklärung habe ich gesucht um zu verstehen wie ich was anwende damit zum Schluss nur das fertige Template angezeigt wird. Ich werde jetzt versuchen mich nach und nach einzuarbeiten.

    Nur meine if Abfrage die ich im ersten Beispiel hatte, wird dann über das Template am besten verarbeitet?




    Noch ein schönes drittes Adventswochenende.

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snowflake ()