dedlfix: OOP Konflikt

Beitrag lesen

echo $begrüßung;

Also ein FrontController reagiert z.B. auf Formulareingaben,

Die Formulareingaben sind eigentlich weniger interessant für ihn. Die Routing-Information entnimmt er im Allgemeinen der URL.

und instanziert dann die passende Klasse

Der vom FrontController verwendete Router ermittelt zwei Dinge: den Controller und eine Action davon.

die durch __autoload() nachgeladen werden und ruft den passenden Controller auf,

Ob Autoload oder nicht ist nebensächlich. Auf jeden Fall wird der (Action-)Controller instantiiert. Der kann in seinem Konstruktor allgemeine Initialisierungsaufgaben für sein Fachgebiet erledigen, wenn das erforderlich ist.

dieser entscheidet dann ein zweites mal, an welche Methode die Daten in "Models" müssen und lässt das Ergebnis dann in "Views" ausgeben.

Nach der Instantiierung des ActionControllers ruft der FrontController eine Action dieses ActionControllers auf. Diese Action führt das aus, was zu tun ist. Sie jongliert mit Daten (inklusive der Formulardaten) zwischen Model und View und gibt am Ende etwas an den FrontController zurück, das dieser dem Webserver als Ergebnis überreicht.

Definiere Action und gebe mir ein kleines CodeBeispiel für einen Controller bitte. Reicht in Pseudo.

Ich zeig dir mal ein "echtes Beispiel", allerdings in C#: http://www.asp.net/learn/mvc/tutorial-21-cs.aspx. Roll da mal runter bis zum Listing 1. Da ist ein Grundgerüst für einen Controller namens HomeController zu sehen (Eigentlich müsste der MoviesController heißen, doch der Einfachheit halber hat man für das Beispiel den HomeController missbraucht.)

Du findest dort solche Zeilen:

// GET: /Home/Details/5
  public ActionResult Details(int id)

ActionResult ist der Typ des Rückgabewertes, Details der Name der Action. Und im Kommentar sieht man, welche URL (im Default-Fall, also wenn man den Router nicht mit eigenen Regeln erweitert hat) zum Aufruf dieser Action führt. Der Router hat also aus der URL ermittelt, dass der HomeController zu instantiieren ist, ruft von ihm die Action Details auf und übergibt eine 5 als Parameter namens id (und vom Typ int(eger)).

Weitere Actions sind Index, Create und Edit. Create und Edit gibt es jeweils in zwei Ausführungen. Einmal kann man sie per GET aufrufen, um das Anlegen eines neuen Datensatzes oder das Editieren eines bestehenden zu beginnen. Dazu wird ein leeres Formular angezeigt (Create) oder eins mit den Daten aus der Datenbank (Edit). Wenn das Formular per POST zurückgesendet wird, wird die andere Action aufgerufen, die sich um das Eintragen kümmert und anschließend auf die Index-Action weiterleitet.

Da es sich bei dem Listing nur um ein automatisch erstelltes Grundgerüst handelt, sieht man als Inhalt der Actions meist nur ein return View(). Welche View ausgeführt wird, ergibt sich im Default-Fall automatisch aus den Namen von Controller und Action. Auch sieht man noch keinen Zugriff auf ein Model. Es ist lediglich bei den POST-Actions angedeutet, dass da noch eine Verarbeitung zu implementieren ist.

Und wie machst du das mit der Bennenung der Dateien? So wie ich im Beispiel? KlassennameView.php / -Controller.php / -Model.php ?

Du benennst sie nach ihrer jeweiligen Aufgabe. Beispielsweise (Dateien inklusive Verzeichnisse und Klassen gemäß Zend-Framework-Benamsungsschema):

  • Controller/Board.php -> Controller_Board

  • View/Board/Index.php -> View_Board_Index (falls eine Einstiegsseite benötigt wird, sonst kann man auch gleich die Kategorien listen)

  • View/Board/Categories.php -> View_Board_Categories (Liste aller Kategorien)

  • View/Board/CategoryEdit.php -> View_Board_Category (Formular für das Erstellen oder Ändern einer Kategorie)

  • View/Admin/Board/CategoryEdit.php -> View_Admin_Board_Category (Alternative, wenn Admin-Tätigkeiten in einem eigenen Controller implementiert werden)

  • View/Board/Postings.php -> View_Board_Postings (Liste aller Postings einer Kategorie)

  • View/Board/Posting.php -> View_Board_Posting (ein Posting (inklusive Antworten))

  • View/Board/PostingNew.php -> View_Board_PostingNew (Formular für das Erstellen eines Postings)

  • Model/Board/Category.php -> Model_Board_Category

  • Model/Board/Posting.php -> Model_Board_Posting

Öffentliche Methoden von Model_Board_Category können zum Beispiel sein: List(), Get(id), Create(name), Edit(id, name)

» man übergibt besser die Daten einer Helper-Funktion, die die Listendarstellung erzeugt.
Die man dann aber selber schreibt oder?

Ja, falls sie noch nicht vorhanden ist. Schau mal im Zend Framwork in das Verzeichnis Zend/View/Helper. Da stehen schon einige.

echo "$verabschiedung $name";