php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 07.06.2011, 09:05  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard MVC Fragen

Hallo leute,

ich schaue mir gerade diese Tutorial an um MVC ein wenig besser zu verstehen
http://tutorials.lemme.at/mvc-mit-php/index.html

Also vom gedanken her ist klar, dass der Controller anhand der Benutzeraktionen ein View ausgibt und dem View eventuelle Daten vom Model abgibt.. nun kommt es aber zur Praxis. Soweit ich verstanden habe, MUSS zu jedem Controller ein View erstellt werden. Models gibt es aber nicht viele.

Laut dem Tutorial haben die eine instanz von View und Model im Controller erstellt und die Methoden der Klassen aufgerufen.

Ich finde das ganze ein wenig unpraktisch und habe mir folgendes überlegt:

Ich erstelle eine Klasse BaseView, BaseController,BaseModel

BaseModel ist die Mutterklasse von
XMLModel //Daten kommen aus XML Dateien
JSONModel //Daten kommen aus JSON Dateien für Ajax
PDOModel //Daten kommen aus der Datenbank
POModel //Daten kommen aus .po Dateien für gettext

Das BaseView soll im Grunde ein Templateparser sein und jedesmal automatisch anhand der Kindklasse eine Datei einbinden.

zb LoginWindowView extends BaseView dabei wird die Datei LoginWindow.html eingebunden in der BaseView klasse und geparst.
Das View Bestimmt welches Model aufgerufen werden soll anhand Template variablen.

zb steht in der LoginWindow.html dann sowas wie
{text->foo} //Damit wird POModel instanz im BaseView erzeugt und foo ausgegeben
{xml->bar->foo->bla} //XMLModel wird instanziert
{var->foobar} //Diese Variable befindet wird in LoginWindowController belegt um zb anzuzeigen dass Benutzername nicht stimmt


Also zusammengefasst: Ich habe eine ControllerFactory die anhand von $_REQUEST einen Controller Aufruft, dieser Controller bestimmt welche View er aufrufen soll und das View ruft jenachdem ein bestimmtes Model auf, wobei der Controller auch ein Model aufrufen kann bzw ruft der Controller andere klassen die nichts mit MVC zutun haben auf und diese klassen rufen dann ein Model auf. zb

PHP-Code:
LoginWindowController extends BaseController{
private 
$user;
var 
$foobar;// die variable von dem View
public function __construct(){
$this->user = new Account(); //Ruft das PDOModel intern auf
}
public function 
login(){
$this->user->login($_POST['user'],$_POST['pw']);
$this->foobar $this->user->getMessage(); //Methode Ruft das POModel auf
}



Meine Frage wäre nun habe ich es so richtig verstanden und kann man es so umsetzen? Oder wäre es kein Richtiges MVC?

Oder habe ich alles komplett falsch verstanden?

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (07.06.2011 um 09:10 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.06.2011, 09:37  
Gesperrt
 
Registriert seit: 07.06.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
21.12.2012DEAD ist in Verruf geraten
Standard

Zitat:
Zitat von BlackScorp Beitrag anzeigen
Oder habe ich alles komplett falsch verstanden?
kann man so sagen
21.12.2012DEAD ist offline   Mit Zitat antworten
Alt 07.06.2011, 09:39  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Wozu willst Du pro Controller eine eigene View-Klasse? Ein Template reicht doch..

Templateparser... Naja - Das Thema hatten wir ja schon zur Genüge

Zitat:
zb steht in der LoginWindow.html dann sowas wie
{text->foo} //Damit wird POModel instanz im BaseView erzeugt und foo ausgegeben
{xml->bar->foo->bla} //XMLModel wird instanziert
{var->foobar} //Diese Variable befindet wird in LoginWindowController belegt um zb anzuzeigen dass Benutzername nicht stimmt
Du zäumst das Pferd von hinten auf. Im View sollten nur explizit übergebene Daten vorhanden sein und keine Models instanziiert werden und ähnliches. Auch sollte sich nicht auf implizites Vorhandensein einer Variable im Controller verlassen.

Das Tutorial zeigt das Prinzip schon recht anschaulich. Ein Controller - ein View - ein Model (Wobei ich nicht finde, dass ein Controller explizit ein eigenes Model bekommen muss)
xm22 ist offline   Mit Zitat antworten
Alt 07.06.2011, 09:49  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von xm22 Beitrag anzeigen
Wozu willst Du pro Controller eine eigene View-Klasse? Ein Template reicht doch..
hm.. ich habe so verstanden dass jeder Controller ein View braucht..

Zitat:
Zitat von xm22 Beitrag anzeigen
Du zäumst das Pferd von hinten auf. Im View sollten nur explizit übergebene Daten vorhanden sein und keine Models instanziiert werden und ähnliches.
schon aber dieses

PHP-Code:
   $view->assign('title'$entry['title']);  
       
$view->assign('content'$entry['content']); 
kann ganz schön übersichtlich werden und man müsste jedesmal in der template nachschauen wie hieß es doch gleich? content oder leftContent oder NaviContent oder sonstwie.. wenn man eine seite mit vielen text elementen hat kommt man schnell durcheinander, desswegen dachte ich mir dass wenn ein template geparst wird, dass dort auch atomatisch bestimmt wird woher die daten kommen sollten.

das Assign kann man ja für die "wichtigen" daten benutzen.

Zitat:
Zitat von xm22 Beitrag anzeigen
Auch sollte sich nicht auf implizites Vorhandensein einer Variable im Controller verlassen.
naja es sollte halt nur ein kleiner beispiel sein, ich wollte halt damit sagen dass anhand des Templates bestimmt wird, welches Model aufgerufen werden soll und anhand der Controllers bestimmt wird welcher View aufgerufen wird.

Zitat:
Zitat von xm22 Beitrag anzeigen
Das Tutorial zeigt das Prinzip schon recht anschaulich. Ein Controller - ein View - ein Model (Wobei ich nicht finde, dass ein Controller explizit ein eigenes Model bekommen muss)
Ja ein Controller braucht nicht umebdingt ein Model

wobei ich mir die frage stelle ob man nicht noch eine sessionModel und CookieModel klasse benötigt, genauso wie eine GETModel und POSTMOdel weil es ja alles datenquellen sind.. also würden man dann weiter um 3 ecken denken und sagen dass ein Model ein Controller aufruft der ein View aufruft der ein Model aufruft... bin gerade leicht verwirrt.
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (07.06.2011 um 10:08 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 07.06.2011, 10:33  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
hm.. ich habe so verstanden dass jeder Controller ein View braucht..
Ja - Im Sinne von Template. Aber keine eigene View-Klasse. Überleg mal: Die wird in 99% aller Fälle das selbe machen (Variablen entgegen nehmen und ein Template rendern)

Zitat:
wobei ich mir die frage stelle ob man nicht noch eine sessionModel und CookieModel klasse benötigt, genauso wie eine GETModel und POSTMOdel weil es ja alles datenquellen sind..
Immer schön langsam und nicht übertreiben Das ist eine Frage der Vorliebe, wie weit Du alles kapselst. Im Prinzip könntest Du für jeden Parameter ein einzelnes Model machen. Ob das sinnvoll ist, ist die Frage. Am Anfang ist es einfacher, einfach auf $_GET, $_POST, $_SESSION, etc. direkt zuzugreifen. Wrapper dafür kannst Du später immer noch bauen.

Zitat:
kann ganz schön übersichtlich werden und man müsste jedesmal in der template nachschauen wie hieß es doch gleich?
Mh.. mir ist bisher noch kein Fall untergekommen, wo das ein Problem gewesen wäre. Andersrum kann aber das Problem entstehen, dass Du Deinen Controller umbaust und auf einmal Variablen fehlen. Mit dem assign hast Du immer im Blick, welche Variablen für das View vorhanden sein _müssen_.

Zitat:
ich wollte halt damit sagen dass anhand des Templates bestimmt wird, welches Model aufgerufen werden soll
Nee - ganz falsch. Das View darf keine "Entscheidungsgewalt" darüber haben, wo irgendwelche Daten herkommen. Es darf prinzipiell die Daten nur darstellen - View halt.

Zitat:
lso würden man dann weiter um 3 ecken denken und sagen dass ein Model ein Controller aufruft der ein View aufruft der ein Model aufruft... bin gerade leicht verwirrt.
Ich auch...

Zitat:
aja es sollte halt nur ein kleiner beispiel sein, ich wollte halt damit sagen dass anhand des Templates bestimmt wird, welches Model aufgerufen werden soll und anhand der Controllers bestimmt wird welcher View aufgerufen wird.
Hä? Klingt kompliziert und falsch...

Im Web läuft es im Prinzip so: Controller wird aufgerufen, der ruft das/die Views und Models auf.

Vielleicht solltest Du Dir mal den hmv-Ansatz anschauen, der gefällt Dir vielleicht etwas besser..
xm22 ist offline   Mit Zitat antworten
Alt 07.06.2011, 10:47  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von xm22 Beitrag anzeigen
Nee - ganz falsch. Das View darf keine "Entscheidungsgewalt" darüber haben, wo irgendwelche Daten herkommen. Es darf prinzipiell die Daten nur darstellen - View halt.
Hieß es nicht dass nur das View das Template "kennt" und weis was es damit tun mus? Ich dachte eigentlich der Controller bestimmt welches View aufgerufen wird aber das View bestimmt was angezeigt wird also auch welchen Inhalt..

Wenn ein View eine Instanz von einem Model aufruft dann ist es doch keine entscheidungsgewalt sondern eine klare Trennung.. Controller soll eben nicht bestimmen welche werte in einem View angezeigt werden und woher die Daten kommen. Er soll kontrollieren und bestimmen was angezeigt werden soll.


Zitat:
Zitat von xm22 Beitrag anzeigen
Vielleicht solltest Du Dir mal den hmv-Ansatz anschauen, der gefällt Dir vielleicht etwas besser..
Soweit ich weis setzt hmvc auf mvc und wenn ich das eine noch nicht verstehe, wird das andere dann noch schlimmer..


laut wiki steht hier folgendes:

Zitat:
Präsentation (view)
Die Präsentationsschicht ist für die Darstellung der benötigten Daten aus dem Modell und die Entgegennahme von Benutzerinteraktionen zuständig.
Für mich klingt das nach View klasse instanziert Model klassen

Zitat:
Modell (model)
Das Modell enthält die darzustellenden Daten und gegebenenfalls (abhängig von der Implementierung des MVC-Patterns) auch die Geschäftslogik.
Im grunde ein zwischenspeicher der Daten von Medien(DB,Dateien etc.pp) zwischenspeichert und anzeigen kann(überschreiben oder löschen auch?)

Zitat:
Steuerung (controller)
Die Steuerung verwaltet eine oder mehrere Präsentationen, nimmt von ihnen Benutzeraktionen entgegen, wertet diese aus und agiert entsprechend. Zu jeder Präsentation existiert ein Modell.
Es steuert ledeglich die Benutzeraktion und zeigt ein View, was aber in das View reinkommt hängt nicht vom Controller ab.

zur jeder Präsentation exestiert ein Modell.. wahrscheinlich ist eine Template Datei eine HTMLModel klasse oder so..

entweder ist das MVC Tutorial falsch oder der Wiki eintrag..
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 07.06.2011, 10:49  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von 21.12.2012DEAD Beitrag anzeigen
hast du meine antwort überhaupt gelesn????
wenn du eine sinnvolle antwort erstellst, werde ich sie mir durchlesen..
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 07.06.2011, 10:51  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von 21.12.2012DEAD Beitrag anzeigen
Okay

Sinnvoll: Hör auf mit php
eigentlich müsste dein nick 07.06.2011BANN lauten...
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 07.06.2011, 11:13  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
laut wiki steht hier folgendes:

Zitat:
Präsentation (view)
Die Präsentationsschicht ist für die Darstellung der benötigten Daten aus dem Modell und die Entgegennahme von Benutzerinteraktionen zuständig.
Für mich klingt das nach View klasse instanziert Model klassen
MVC läuft im Web etwas anders als das ursprüngliche MVC. Dadurch, dass Du per http mit der Applikation kommunizierst, muss diese per Front-Controller "erkennen" können, was Du überhaupt willst und dann den entsprechenden Controller aufrufen.

Zitat:
Hieß es nicht dass nur das View das Template "kennt" und weis was es damit tun mus? Ich dachte eigentlich der Controller bestimmt welches View aufgerufen wird aber das View bestimmt was angezeigt wird also auch welchen Inhalt..
View-Klasse != View
Unter dem View versteht man i. d. R. das, was Du hier als Template bezeichnest. Schau Dir vielleicht mal vorhandene MVC-Frameworks an. Die meisten bieten einen schematischen Überblick über ihre Funktionsweise, so dass Du das nachvollziehen kannst.

Zitat:
Im grunde ein zwischenspeicher der Daten von Medien(DB,Dateien etc.pp) zwischenspeichert und anzeigen kann(überschreiben oder löschen auch?)
Das Model soll nichts anzeigen.

Inwiefern das Model Datenoperationen ausführen kann, hängt von der Applikation ab.

Zitat:
Es steuert ledeglich die Benutzeraktion und zeigt ein View, was aber in das View reinkommt hängt nicht vom Controller ab.

zur jeder Präsentation exestiert ein Modell.. wahrscheinlich ist eine Template Datei eine HTMLModel klasse oder so..
Das klingt aber sehr verquer. Noch mal: Das Model hat nichts mit der Darstellung zu tun.

Verinnerlich Dir das Prinzip:

Front-Controller -> Controller (Holt sich ggf. Daten vom Model und weist sie dem View zu) -> View (Stellt Daten dar und nimmt Interaktionen des Users entgegen) -> Front-Controller -> ...

Zitat:
entweder ist das MVC Tutorial falsch oder der Wiki eintrag..
Beide haben recht Nur ist der Fokus bei beiden unterschiedlich.

Zitat:
Sinnvoll: Hör auf mit php
Zitat:
eigentlich müsste dein nick 07.06.2011BANN lauten...
Leute, das ist Kindergarten-Niveau..
xm22 ist offline   Mit Zitat antworten
Alt 07.06.2011, 11:59  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Bezüglich des Front-Controller. in CakePHP wird dafür der "Router" verwendet, der bestimmt welceh controller aufgerufen werden.(denke ich)

View-Klasse ist im grunde "Template parser".(verstanden soweit)

mit Model->daten anzeigen meinte ich halt return irgendwas also variable an das View übergeben und das view zeigt es an.

Bezüglich View bestimmt selber woher seine daten kommen.

Soweit ich es gesehen habe, wird sowas bei APF auch gemacht, da geht es sogar noch weiter, ein View bindet ein Controller in sich

PHP-Code:
<@controller namespace="sites::testwebsite::pres::documentcontroller" file="content_v1_controller" class="content_v1_controller" @> 
und das hier würde ja dem MVC wiedersprechen

PHP-Code:
class content_v1_controller extends base_controller { public function transformContent(){ $cM = &$this->getServiceObject('core::database','ConnectionManager'); $SQL = &$cM->getConnection('content-database'); // URL-Parameter beziehen $page = RequestHandler::getValue('Seite','Startseite'); // Parameter gegen SQL-Injections absichern $page = $SQL->escapeValue($page); // Inhalt der Seite auslesen $select = 'SELECT PageContent FROM demopage_content WHERE PageURLName = \''.$page.'\' LIMIT 1'; $result = $SQL->executeTextStatement($select); $data = $SQL->fetchData($result); // Inhalt der Seite ausgeben $this->__Content = $data['PageContent']; } } 
da müsste doch in transformContent dann eigentlich eine instanz von content_v1_model gebildet werden und dann $this->_Content = $contentModel->getData('pageContent') aufgerufen werden..

also das anschauen der Frameworks bringt ja nicht wirklich was , da ja jeder es so macht wie es gerade passt..

also könnte man ja folgenden Prinzip verwenden ohne zu sagen dass es falsch ist:

1)MainController wird aufgerufen
2) MainController lädt MainView
3) MainView holt sich ggf. daten aus Models und ruft ggf. SubController auf
4) Je nach request kann ein SubController ein Model aufrufen und daten manipulieren, an view übergeben oder eine externe klasse aufrufen . Zusätzlich MUSS der SubController ein dazugehöriges View aufrufen.
5) das aufgerufene subView holt sich weitere daten aus einem Model

langsam glaube ich dass das MVC so ein "Nichts ist falsch,alles ist erlaubt " ding solange man ganz klar aufteilt dass Daten im Model gespeichert werden, anzeige durch ein View passiert und der Controller bestimmt was angezeigt wird.
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Drei spezielle Fragen zu CSS Karottenkopf51 HTML, Usability und Barrierefreiheit 3 22.05.2011 12:52
PHP Fragen (IDE, Kommentare, Vordefinierte Variablen usw.) thedoctor46 PHP Einsteiger 2 08.02.2011 15:08
Performance Fragen jwka61 PHP Tipps 2010 7 17.11.2010 19:48
Erneuern von Fragen DasBlatt PHP Tipps 2010 8 22.02.2010 15:30
Ein paar kleine Fragen Benshy PHP Tipps 2009 5 08.08.2009 17:21
ein paar Fragen (wegen eines Loginhistory) Ninos PHP Tipps 2009 5 04.04.2009 14:59
PHP/MySQL Softwareprojekt - grundsätzliche Fragen spacemanspiff Software-Design 1 30.01.2009 14:40
Renommee Funktion wirft Fragen... tomtaz Board-Support 11 02.07.2008 21:18
gettext, einige fragen notyyy PHP Tipps 2008 12 01.05.2008 12:09
Generelle PHP Fragen Madden PHP-Fortgeschrittene 3 11.04.2005 01:24
[Erledigt] Allgemeine Anfänger Fragen PHP Tipps 2004-2 5 20.12.2004 14:57
Fragen über Fragen :) Igäl PHP Tipps 2004 3 26.08.2004 08:59
[Erledigt] Fragen über Fragen... wer kann helfen? PHP Tipps 2004 2 08.07.2004 21:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
classe automatisch finden php mvc, wie ruft man controller in mvc php auf, apf where pageurlname, php mvc verstehen, lemme, php form ruft klasse, lädt der view die dateien oder der controller, ext designer mvc, getserviceobject() base_controller, &$this->getserviceobject(\'core::database\',\'connectionmanager\'), extends base_controller apf getserviceobject, php: mvc zuerst view, template, mvc instanzieren, mvc, php development, mvc php

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:35 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum