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 19.10.2009, 17:54  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard URLs erzeugen und routen

Hi,

ich entwickle (bzw. habe entwickelt) momentan einen URL-Router, der ungefähr so arbeitet wie der Router von Zend. Hier mal ein Codebeispiel, das die Verwendung meines Routers zeigt:

PHP-Code:
$rRes = new FW_Http_Request_Resolver_ModRewrite($request);


$rRes->addRoute("pic", new FW_Http_Request_Resolver_ModRewrite_Route("picture/@id"
                                                                     array(
                                                                            
"action" => "show"
                                                                            
"controller" => "picture"
                                                                          
), 
                                                                     array(
"id" => array(
                                                                                         new 
FW_Validator_Type_Integer()
                                                                                        )
                                                                          )
                                                                    )
              ); 
              
$rRes->addRoute("picthmb", new FW_Http_Request_Resolver_ModRewrite_Route("picture/@id/thumb"
                                                                         array(
                                                                                
"action" => "show_thumb"
                                                                                
"controller" => "picture"
                                                                               
), 
                                                                         array(
"id" => array(
                                                                                             new 
FW_Validator_Type_Integer()
                                                                                            )
                                                                              )
                                                                         )
                ); 
                
$rRes->addRoute("links", new FW_Http_Request_Resolver_ModRewrite_Route("picture/links/@id"
                                                                         array(
                                                                                
"action" => "show_links"
                                                                                
"controller" => "picture"
                                                                               
), 
                                                                         array(
"id" => array(
                                                                                             new 
FW_Validator_Type_Integer()
                                                                                            )
                                                                              )
                                                                         )
                ); 
                
$frontController->route($rRes); 
Außerdem hat der Router immer folgende Standartrouten:
PHP-Code:
class FW_Http_Request_Resolver_ModRewrite extends FW_Http_Request_Resolver_Abstract
{  
  public function 
init()
  {
    
$this->addRoute("home",     new FW_Http_Request_Resolver_ModRewrite_Route("", array("controller" => "index""action" => "index")));
    
$this->addRoute("ctrl",     new FW_Http_Request_Resolver_ModRewrite_Route("@controller", array("action" => "index")));
    
$this->addRoute("ctrl_act", new FW_Http_Request_Resolver_ModRewrite_Route("@controller/@action"));    
  } 
Eine kleine Erklärung zu den Routen:
Alles, was mit @ beginnt, ist eine Variable. Hier kann alles stehen, sofern nicht näher mit Validatoren eingeschränkt wird. Alles, was nicht mit @ beginnt, sind Konstanten. Hier darf dann auch nichts anderes stehen.

Erzeugung von URLs
Das Routen der URLs funktioniert wunderbar. Was mir jetzt aber Gedanken macht, ist das Erzeugen der URLs. Ich habe mir das so Gedacht:

Es gibt einen ViewHelper (LinkHelper), der ein Array mit Parametern entgegennehmen kann. Nehmen wir an, dass es die Routen "@controller" und "@controller/@action" gibt. Hier würde meine Methode anhand den übergebenen Parametern entscheiden, welche Route sie zum Erzeugen der URLs verwendet. Übergibt man der Methode also array("controller" => "index"), wird die Route "@controller" angwendet. Übergibt man array("controller" => "index", "action" => "index"), wird die andere Route benutzt.

Bis hier hin funktioniert mein Konzept auch.
Wenn es jetzt aber aus welchem Grund auch immer z.B. folgende Routen gibt, habe ich ein Problem!

bla/@controller/@action
haha/@controller/@action
@controller/trenner/@action
@controller/@action/lol

Es würden auf das übergebene Array (controller => index, action => index) alle 4 Routen passen! Nur welche nehm ich dann?
Ich würde nur sehr ungerne im Template sagen müssen, welche Route verwendet werden soll.

Ich hoffe, ihr versteht mein Problem und könnt mir bei der Lösung helfen!

MfG
Simon
fat32 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 19.10.2009, 18:11  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Naja wenn du im View eine Route angeben möchtest muss diese ja eindeutig definiert sein. Das geht über einen Identifier, also einen Namen der Route! So löst es zumindest das Zend Framework!
Flor1an ist offline   Mit Zitat antworten
Alt 19.10.2009, 18:16  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard

Ja, genau das möchte ich vermeiden

Wenn ich neue Routen hinzufüge oder alte ändere, muss ich auch alles Templates anpassen
fat32 ist offline   Mit Zitat antworten
Alt 19.10.2009, 19:16  
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 fat32,

du läufst hier genau wieder in diejenigen Probleme, in die du auch bei einem nicht generischen URL-Layout stößt. Das hatten wir - soweit ich mich erinnern kann - schon mal in aller Ausführlichkeit diskutiert.

Das Problem sind hier nicht die Routen, sondern das Mapping von einer Route auf einen Controller. Man sollte das konzeptionell trennen. Siehe http://www.php.de/software-design/56...tml#post457910 (erweitertes Controlling (MVC)).
__________________
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 25.10.2009, 16:49  
Benutzer
 
Registriert seit: 27.03.2008
Beiträge: 99
PHP-Kenntnisse:
Fortgeschritten
fat32 befindet sich auf einem aufstrebenden Ast
Standard

Hi,

danke für deine Antwort!

Ich habe den Thread gelesen, aber keine Antwort auf meine Frage gefunden.

Wie erstelle ich denn URLs am "besten"?
Und wenn mein Ansatz falsch ist, warum wird er dann vom Zend-Framework genau so verfolgt?

Ich würde mich über ein Beispiel freuen, das evtl. diese Punkte beinhaltet:
  • Erstellung von URLs anhand von übergebenen Parametern (controller, action, weitere parameter. alles optional)
  • Erstellung von URLs, die prefixe beinhalten. Diese Prefixe können dazu genutzt werden, verschiedene Bereiche einer Seite zu gliedern. z.B. /bereich1/controller/action
Ich dachte schon an folgende Lösung:
Es gibt eine Methode, die folgende Parameter entgegennimmt: Controller, Action, Params (array)

Diese Methode baut dann die URL immer so auf
  1. Controller/
  2. Action/
  3. Jeden weiteren Parameter mit / getrennt anhängen (indem das array per foreach durchlaufen wird)
Das ist aber sehr unflexibel und passt nicht auf die oben genannten Anforderungen.

MfG
Simon
fat32 ist offline   Mit Zitat antworten
Alt 25.10.2009, 19: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 Simon,

sofern du im angesprochenen Thread keine Antworten gefunden hast ist das etwas merkwürdig. Ab dem Post 462065 (erweitertes Controlling (MVC)) mehrfach von generischem URL-Layout und Entkopplung von Modulen über die URL.

Zitat:
Wie erstelle ich denn URLs am "besten"?
Ich fasse mal kurz zusammen: hierzu ist eine Komponente notwendig, über die jedes Modul die für sich notwenidgen URLs generiert. Dieses respecktiert nicht nur die in der URL bisher enthalten Parameter, sondern auch die Front-Controller-Action-Daten, die aktuell ausgeführt werden sollen. Dabei wird eine Codierung der URL gewählt, die nicht an ein starres Gestell - wie von dir bereits als unflexibel betitelt - gebunden sind. Das von mir hier vorgeschlagene URL-Schema (das übrigens auch so vom APF unterstützt wird) sieht wie folgt aus:

"Normale" URL:
Code:
?param1=value1&param2=value2&my_namespace-action:actionName=aparam1:avalue1|aparam2:avalue2&...
param1 und param2 sind dabei "normale" parameter, die an beliebiger Position auftauchen können, der Parameter my_namespace-action:actionName adressiert eine Action unter dem Namespace my::namespace und mit dem Namen actionName. Der String nach dem "=" ist eine Parameter-Repräsentation, die Paare durch Pipe und Name zu Wert per ":" trennt. Die zuständige Link-Generierungs-Komponente und der Front- und Page-Controller können die Parameter dann entsprechend ihrer Zielsetzung nutzen.

Rewrite-URL:
Code:
/param1/value1/param2/value2/~/my_namespace-action/actionName/aparam1/avalue1/aparam2/avalue2/~/...
Auch hier können die Parameter aram1 und param2 an beliebiger Position auftauchen. Die Front-Controller-Anweisung wird per "/~/" von den "normalen" Parametern getrennt und kann auch an beliebiger Position auftauchen.

Damit ist es möglich eine beliebige Komplexität der GUI bei linearer Komplexität der URL zu erreichen.

Zitat:
Und wenn mein Ansatz falsch ist, warum wird er dann vom Zend-Framework genau so verfolgt?
Die Gründe kenne ich nicht im Detail, ich vermute jedoch, weil das GUI-Konzept des Zend Frameworks diese Komplexität nicht abbilden kann. Somit besteht auch nicht die Notwendigkeit eine derartige Komplexität in der URL abzubildnen. Das APF hingegen ist genau für diesen Anwendungs-Fall ausgelegt und unterstützt ein solches URL-Layout auch. Damit ist sichergestellt, dass du über die URL beliebige Module miteinander kombinieren kannst ohnd dass ein Modul etwas vom anderen wissen muss. Es muss lediglich sichergestellt sein, dass die Link erzeugende Komponente diese Gemeinsamkeit (=URL-Parameter) auch dem Konzept entsprechend verwalten kann.

Ich hoffe, ich konnte dir den Ansatz etwas näher bringen.
__________________
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
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] Klassen zur Laufzeit erzeugen theraipper PHP-Fortgeschrittene 16 10.10.2008 23:52
mod_rewrite Problem mit encodierten URLs R4v3r Server, Hosting und Workstations 0 25.07.2008 18:42
Tool um (Spiel)Klassen zu erzeugen Martin13 PHP-Fortgeschrittene 6 05.09.2007 02:25
SQL Abfrage erzeugen/ string bearbeitung easy PHP Tipps 2007 20 28.03.2007 22:12
mit php html-dateien erzeugen Crypi PHP Tipps 2007 6 20.02.2007 14:51
phpmyadmin - mysqldump konformen Export erzeugen? DonTermi Datenbanken 2 22.12.2006 13:45
automatische Thumbs erzeugen rabatz PHP Tipps 2006 7 08.07.2006 19:12
Aus mehrere Gifs ein animated Gif erzeugen? think_mac PHP Tipps 2006 4 03.04.2006 15:16
Bild erzeugen meisterigel PHP Tipps 2006 5 28.03.2006 14:43
Probleme mit Urls und Dom KLasse. daniel987 PHP Tipps 2005-2 3 22.07.2005 15:17
POP3 - erzeugen, abrufen, löschen & user und pw - frage PHP Tipps 2004-2 2 24.12.2004 17:19
URL's ausgeben PHP Tipps 2004-2 9 11.11.2004 16:14
Suchmuster für URLs PHP Tipps 2004 2 21.10.2004 08:06
Datei mit php erzeugen Stümper PHP Tipps 2004 4 12.10.2004 12:51
[Erledigt] variable Tabellen erzeugen PHP Tipps 2004 1 14.06.2004 09:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php url routing, php routing, url routing php, zend url generieren, komplexität der urls, php url router, php url erzeugen, php: url router, routing php, url routing mapping php, php routen, http://www.php.de/software-design/60230-urls-erzeugen-und-routen.html, url routen, url router php, komplexität der url vermeiden, zend url erzeugen, php url routing class, php url controller, php url generieren, zend urls generieren

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