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 Thema bewerten
Alt 04.01.2011, 20:10  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard Request-Parameter und deren Routing

Hallo zusammen,

in den letzten Tagen beschäftigt mich immer wieder folgende Überlegung: Wie gestalte ich das Routing von Request-Parametern dynamischer und effizienter? Mein momentanes Vorgehen möchte ich in aller Kürze vorstellen.

In der index.php wird ein Front-Controller instanziiert. Diesem wird per Konstruktur das $_GET-Array übergeben, welches anschließend in einer switch-Anweisung landet. Anhand der verschiedenen Fälle wird entweder ein weiterer Controller geladen, bspw.:

PHP-Code:
case 'gästebuch':
    require_once 
'gaestebuch_controller.php';
    
$controller = new Gaestebuch_Controller($request);
    break; 
oder es wird ein Model geladen und dessen Daten an einen View übergeben, z.B.:

PHP-Code:
default:
    
$model = new Content('default');    
    
$main = new View;        
    
$main->setTemplate('template/content.inc.php');
    
$main->setVar('title'$model->getTitle());    
    
$main->setVar('data'$model->getData());
    
Site::set('main'$main); 
Angenommen es wird ein weiterer Controller geladen, wie in diesem Falle der Gästebuch-Controller, ist dessen Konstruktur recht ähnlich gestaltet im Vergleich zum Front-Controller. Wieder findet sich eine switch-Anweisung, wobei anhand der verschiedenen Fälle entweder ein weiterer Controller geladen wird oder eine Action-Methode aufgerufen wird, wie z.B.:

PHP-Code:
case 'beitrag-schreiben':
    
$this->createEntry();
    break; 
Prinzipiell ist der Verschachtelung bzw. Tiefe keine Grenze gesetzt. Mich stört allerdings gewaltig, dass jeder Konstruktur eine mal längere oder auch kürzere switch-Anweisung enthält. Auch habe ich den Eindruck, das dies wohl keine gängige Vorgehensweise ist. Demnach würde mich interessieren, welche Vorgehensweise ihr für das Routing pflegt. Schließlich muss der Controller wissen, welche Methoden er aufzurufen hat bzw. ob das Laden eines weiteren Controllers notwendig ist.

Bei mir erledigen das im Moment ausschließlich switch-Anweisungen, die je nach Umfang der Klasse ziemlich sperrig wirken. Wie sieht es bei euch aus?
Trainmaster ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.01.2011, 20:54  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Trainmaster,

das Thema ist bereits mehrfach diskutiert worden. Schau mal unter

Aus meiner Sicht fehlt dir eine generische Implementierung von MVC mit einem Routing, das frei konfigurierbar ist, oder noch besser eine HMVC-Impelemntierung, in der das Aufbauen einer GUI komplett frei passiert und kein Routing mehr nötig ist. Das gekoppelt mit einem Front Controller, der die Business-Logik entsprechend den einzelnen Modulen/Elementen einer Seite vor dem Aufbau der GUI ausführen kann löst die Aufgabenstellung IMHO nachhaltig.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 04.01.2011, 20:56  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Naja, du identifizierst den Namen des Moduls, des Controllers und der Action anhand des Requests und übergibst diesen deiner Routing-Routine. Die Standard-Routing-Routine mappt anhand der 3 Angaben (oder der variablen Parameter) nun auf eine bestimmte Methode einer Klasse (die Aktion), wobei natürlich fehlende Angaben auf ein Default zurückspringen, das vorher (z.B. über eine Config) definiert wurde. Da braucht es überhaupt keine switch-Anweisungen, das fixiert ja nur deine möglichen Routen.

Deiner Routing-Routine könntest du jetzt noch weitere Routinen voranfügen (im Zend gibt es statische, RegExp- usw. Routinen), die prüfen, ob die Route auf sie zutrifft. Wenn ja liefern sie den Namen des Moduls/Controllers/Action. Wenn du weitergehst kannst du auch noch eine Routine einhängen, die die initialen Angaben (M/C/A) übersetzt (deutsch -> englisch) usw.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 04.01.2011, 23:02  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

@ dr.e.

Danke für deine Antwort. Einige deiner genannten Themen habe ich mir bereits in den letzten Tagen mehrfach gelesen. Allerdings muss ich zugeben, dass mir teilweise die nötige Erfahrung und ein gewisses Grundwissen fehlt, damit ich daraus etwas lernen kann (Das betrifft auch teilweise deine Beiträge ). Ich denke, ich sollte mir ein wenig Literatur anschaffen.


@ Chriz

Soweit ich deine Ausführung verstanden habe, ist in diesem Falle die Routing-Routine das Schlüsselkonzept. Wenn du sagst, dass rein gar keine switch-Anweisungen nötig sind, frage ich mich, auf welche Weise die Routing-Routine weiß, wie sie zu verfahren hat. Sind sämtliche Routen bspw. in einer XML-Datei gespeichert? Irgendwo muss schließlich hinterlegt sein, welche Aktion bei den verschiedenen URL-Parametern ausgeführt werden soll.
Trainmaster ist offline   Mit Zitat antworten
Alt 04.01.2011, 23:38  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ne, wenn ich jetzt

http://www.example.org/news/list

aufrufe, dann wandelt Mod-Rewrite das ja beispielsweise um in:

index.php?request=news/list

Nun zerlegt der FrontController diese Anfrage in
Controller = news
Action = list
(lassen wir die Module mal weg).

Jetzt sucht er in deinem Controllerverzeichnis nach einer Datei "NewsController.php" und der darin befindlichen Klasse "NewsController". Die wird instanziert, bekommt den Request übergeben. OK, erste Hürde geschafft. Jetzt wird geprüft, ob die Methode "listAction" der NewsController-Klasse existiert. Wenn nein, 404 (Nicht gefunden) Errorhandling antriggern (z.B. per Exception), gleiches für fehlenden Controller. Falls gefunden -> aufrufen! Fertig. Jetzt musst du eigentlich nur eins tun wenn du eine neue "Route" (ich schreibs mal in Anführungszeichen) erstellen willst: Du erstellst eine Controller-Klasse und die dazugehörige Methode. Das wars, kein switch() mehr.

Zusätzlich sinnvoll:
Eingabevalidierung (also Controller und Action-Bezeichner validieren/normalisieren, so dass gültige Klassen- bzw. Methodennamen herauskommen, was ja bei "my-news" nicht der Fall wäre)
Jeder Controller muss Instanz eines Controller-Interfaces (oder einer abstrakten Controller-Basisklasse) sein
Jede Action muss auch als Action-Methode im Controller definiert sein (damit dir keiner __construct aufruft o.ä. Spielchen).
(damit dein MVC nicht zum RPC/RMI mutiert)
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 05.01.2011, 01:05  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Ne, wenn ich jetzt

http://www.example.org/news/list

aufrufe, dann wandelt Mod-Rewrite das ja beispielsweise um in:

index.php?request=news/list
Ich würde jetzt eher an etwas wie index.php?controller=news&action=list denken?!

Zitat:
Zitat von Chriz Beitrag anzeigen
Nun zerlegt der FrontController diese Anfrage in
Controller = news
Action = list
(lassen wir die Module mal weg).
Das ist für meinen Geschmack sehr starr und willkürlich. Was ist, wenn "list" keine Action ist, sondern einen weiteren Controller verlangt? Wird dann trotzdem versucht, eine Action auszuführen?

Zitat:
Zitat von Chriz Beitrag anzeigen
Jetzt sucht er in deinem Controllerverzeichnis nach einer Datei "NewsController.php" und der darin befindlichen Klasse "NewsController". Die wird instanziert, bekommt den Request übergeben. OK, erste Hürde geschafft. Jetzt wird geprüft, ob die Methode "listAction" der NewsController-Klasse existiert.
Demnach bleibt bei der Namensgebung nicht sehr viel Spielraum. Wie verhält es sich zudem bei Mehrsprachigkeit? Beispielsweise mag "listAction" existieren, "anzeigenAction" jedoch nicht.
Zudem würde ich das Vorgehen etwas anders angehen. Nachdem "list" nicht unbedingt eine Action sein muss, würde ich zunächst in einem Art Verzeichnis des NewsController überprüfen, welches weitere Vorgehen bei "list" zu wählen ist. Es kann doch sowohl ein weiterer Controller verlangt werden als auch die Ausführung einer Methode?
Trainmaster ist offline   Mit Zitat antworten
Alt 05.01.2011, 09:41  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.563
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

aber eigentlich brauchst du doch den Konstruktoren nicht jedesmal das Get-Array durchreichen - das ist doch "sowieso" Superglobal vorhanden .... oder hab ich da deine Beschreibung missverstanden?
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 05.01.2011, 10:16  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
aber eigentlich brauchst du doch den Konstruktoren nicht jedesmal das Get-Array durchreichen - das ist doch "sowieso" Superglobal vorhanden .... oder hab ich da deine Beschreibung missverstanden?
In einer Klasse sollte man möglichst so wenig wie möglich mit irgendwelchen globalen variablen, wie z.b. get, post, etc arbeiten, das schafft abhängigkeiten, macht code schlechter testbar, etc
robo47 ist offline   Mit Zitat antworten
Alt 05.01.2011, 10:30  
Erfahrener Benutzer
 
Registriert seit: 25.05.2010
Beiträge: 852
PHP-Kenntnisse:
Anfänger
Trainmaster wird schon bald berühmt werden
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
das ist doch "sowieso" Superglobal vorhanden .... oder hab ich da deine Beschreibung missverstanden?
Nein, hast du nicht. Aber das trägt ja nichts zu der Thematik bei bzw. ändert nichts an meinen Sorgen
Trainmaster ist offline   Mit Zitat antworten
Alt 05.01.2011, 11:20  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Ich würde jetzt eher an etwas wie index.php?controller=news&action=list denken?!
Ist ja egal wie das aussieht, aber dann verlagerst du wieder (zumindest etwas) Logik ins .htaccess, was ich persönlich nicht so prickelnd finde. Ich glaube auch der FC des Zend Frameworks greift einzig auf $_SERVER["REQUEST_URI"] zurück.


Zitat:
Zitat von Trainmaster Beitrag anzeigen
Das ist für meinen Geschmack sehr starr und willkürlich.
Also starr und willkürlich widerspricht sich meiner Meinung nach. Bei starr könnte ich dir recht geben (Convention over Configuration), aber ich sehe das als Vorteil. Denn ich will ja das jeder weiß, welche URL auf welche Controller-Action umgemappt wird. Gleichzeitig bleibe ich aber flexibel, wenn ich neue Routen einführe. Starr ist allerdings, da hast du Recht die Struktur: Modul, Controller, Action. Mehr Tiefe gibt es nicht. Zumindest nicht beim MVC.

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Was ist, wenn "list" keine Action ist, sondern einen weiteren Controller verlangt? Wird dann trotzdem versucht, eine Action auszuführen?
Redest du jetzt von Modulen oder allgemein einem Action-Stack? Also dem mehrfachen Ausführen von Actions, z.B. um Contentboxen in einem Layout mit eigener Logik zu versehen?

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Demnach bleibt bei der Namensgebung nicht sehr viel Spielraum.
Wie gesagt, das sehe ich als Vorteil an.

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Wie verhält es sich zudem bei Mehrsprachigkeit? Beispielsweise mag "listAction" existieren, "anzeigenAction" jedoch nicht.
Na dann klemmst du im Router eben eine Übersetzungsroutine ein, die aus "anzeigen" eben ein "list" macht und schon trifft die Route wieder.

Zitat:
Zitat von Trainmaster Beitrag anzeigen
Zudem würde ich das Vorgehen etwas anders angehen. Nachdem "list" nicht unbedingt eine Action sein muss, würde ich zunächst in einem Art Verzeichnis des NewsController überprüfen, welches weitere Vorgehen bei "list" zu wählen ist. Es kann doch sowohl ein weiterer Controller verlangt werden als auch die Ausführung einer Methode?
Warum, die listAction() kann doch durchaus weitere Controller-Actions aufrufen oder in den Stack legen (siehe z.B. ZF), wenn du soetwas in deinem Dispatcher implementiert hast.
__________________
"Nuschel ich?" - "Was?"
Chriz 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
[Erledigt] Funktionsberechtigungne, Rollen und Vererbung von Rechten Geryon Software-Design 37 02.11.2010 23:08
[Erledigt] Mehrere DIV Container mit einem Klick ändern (mit mehreren Request Aufrufe Lebenssonde JavaScript, Ajax und mehr 11 26.08.2010 09:01
Parameter an weiter Funktion übergeben thiagojonas JavaScript, Ajax und mehr 2 26.07.2010 22:48
mod_rewrite URL-Umleitung zu Dateien in Verzeichnissen, mit Slash nach Parameter karthago Server, Hosting und Workstations 4 22.07.2010 16:15
[Erledigt] Optionaler Parameter mit Variable zuweisen Lollix PHP Tipps 2010 6 07.07.2010 17:48
request GET value max length config? Desian PHP-Fortgeschrittene 3 30.06.2010 13:51
[Erledigt] leeres request trotz übergebenen Daten AJAX mupilz JavaScript, Ajax und mehr 6 06.04.2010 06:55
http_class verwenden hans213 PHP Tipps 2009 27 15.01.2010 03:07
[Erledigt] Warning: mysql_result() expects parameter 1 to be resource, boolean given FloRic Datenbanken 8 19.10.2009 20:15
parameter von interfaces in klassen richtig mit anwenden? litterauspirna PHP Tipps 2009 27 30.06.2009 20:58
[Erledigt] PHP5: Request Parameter werden nicht korrekt ausgegeben dmecir PHP Tipps 2008 11 20.08.2008 17:37
Parameter überschreiben Igäl PHP Tipps 2006 8 04.06.2006 19:55
functionen - optionale Parameter PHP Tipps 2005 7 23.05.2005 19:08
Alle $_GET[] parameter auslesen PHP Tipps 2004 3 09.08.2004 14:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
routing php, zend request sauber?, php frontcontroller route.xml, php mvc parameter, request parameter javascript slash, mvc argumente auslesen, parameter von javascript an mvc requestparam, zend route dynamisch nach parametern, php mehrfachparameter auswerten, zend route flexible parameters, php mvc routing, url routing php request_uri, php routing, zend slash parameter route, php request ohne parameter, request an view weitergeben php, php requestparameters slash, php frontcontroller reuqest, zend url parameter aus action heraus, php request routing

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:31 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