Portal > Foren > PHP > PEAR, PECL und Frameworks > Zend Framework - Probleme mit Zend_Controller_RewriteRouter bzw. Form der URLs
Antwort
 
Themen-Optionen
Alt 19.12.2006, 22:59 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard Zend Framework - Probleme mit Zend_Controller_RewriteRouter bzw. Form der URLs

Hallo,
ich beschäftige mich derzeit etwas mit dem Zend Framework und habe irgendwie ein Problem mit dem "Routing".

Es ist ja so, dass ein URL à la example.com/foo/bar auf die Methode barAction() der Klasse FooController geleitet wird. Das ist ja auch alles wunderbar, allerdings würde ich gerne URLs à la example.com/category/1234,a-simple-sample-title erzeugen.

Es gibt im Framework ja die Klasse Zend_Controller_RewriteRouter, welche ja anscheinend (oder hoffentlich) die Möglichkeit bietet solche URLs zu erschaffen.

Ich bekomme das aber irgendwie nicht hin.
Geht das überhaupt? Wenn ja .. hat jemand ein Beispiel, ein Tutorial oder Ähnliches zur Hand?

Ich danke für Eure Hilfe.
Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 08:20 Nach oben    #2
Benutzer
 
Benutzerbild von chrigu
 
Registriert seit: 18.09.2006
Beiträge: 50
Standard

Hi,
Ja solche URLs solltest du mit dem RewriteRouter hinbekommen!
Was geht genau nicht?

Ich arbeite momentan sehr intensiv mit dem ZendFramework und bin begeistert!

Gruss,
Chrigu
chrigu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 08:39 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Hallo,
das ist schon mal gut zu hören .. dann kannst du mir in Zukunft eventuell öfters mal Fragen beantworten.

Ja, also ich nehme dieses Kapitel hier: http://framework.zend.com/manual/de/...terouter.usage
PHP-Code:
$router = new Zend_Controller_RewriteRouter();
$router->addRoute(
    
'user',
    new 
Zend_Controller_Router_Route('user/:username', array('controller' => 'user''action' => 'info'))
);

/* binde ihn in den Controller ein */

$ctrl Zend_Controller_Front::getInstance();
$ctrl->setRouter($router); 
So, okay .. schön, ich kann das aber irgendwie nicht so umbauen, dass ich oben dargestellte URL-Forum erhalte. Mein Problem ist eigentlich nur, dass ich beim Rumtesten keinen wirklichen Ansatz gefunden habe, wie ich das Problem lösen könnte.

Wie gesagt .. vielleicht reicht schon ein kleines Codebeispiel zum Verständnis.


Danke.
Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 10:52 Nach oben    #4
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
So, okay .. schön, ich kann das aber irgendwie nicht so umbauen, dass ich oben dargestellte URL-Forum erhalte. Mein Problem ist eigentlich nur, dass ich beim Rumtesten keinen wirklichen Ansatz gefunden habe, wie ich das Problem lösen könnte.
Einfach mal ins blaue Geraten, sollte es doch so klappen oder nicht
PHP-Code:
$router = new Zend_Controller_RewriteRouter(); 
$router->addRoute
    
'fooBar'
    new 
Zend_Controller_Router_Route('category/:title', array('controller' => 'foo''action' => 'bar')) 
); 
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 11:16 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Hm, ich habe jetzt eine Klasse TestController geschrieben
PHP-Code:
<?php
class TestController extends Zend_Controller_Action {
    
    public function 
indexAction() {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
__call($methodName$arguments) {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
sampleAction() {
        echo 
__METHOD__ '<br />';
    }

?>
So. In meiner index.php, auf die alle Anfragen umgeleitet werden, steht
PHP-Code:
require_once('../prepend.inc.php');

$router = new Zend_Controller_RewriteRouter();
$router->setRewriteBase('');
$router = new Zend_Controller_RewriteRouter(); 
$router->addRoute
    
'test'
    new 
Zend_Controller_Router_Route('test/:title', array('controller' => 'test''action' => 'sample')) 
); 

$controller Zend_Controller_Front::getInstance();

$controller->setRouter($router);
$controller->setControllerDirectory($controllerDir);
$controller->dispatch(); 
Dann habe ich noch eine Klasse IndexController
PHP-Code:
class IndexController extends Zend_Controller_Action {
    
    
    
/**
     *  
     */
    
public function indexAction() {
        echo 
__METHOD__ '<br />';
        
        
    }
    
    
    
/**
     * Wird aufgerufen, wenn zwar ein Controller im URL existiert, aber keine "Action".
     * 
     * @param string $methodName
     * @param array  $arguments
     */
    
public function __call($methodName$arguments) {
        echo 
__METHOD__ '<br />';
    }
    
    
    
/**
     * Wird aufgerufen, wenn kein Controller im URL vorhanden ist.
     */
    
public function norouteAction() {
        echo 
__METHOD__ '<br />';
    }
    

Jau, wenn ich nun www.example.com/test/{sample/} aufrufe erhalte ich die Ausgabe:
Code:
IndexController::indexAction
Wende ich das falsche an? Antwort ist wohl ja und die interessantere Frage ist: Wie wende ich es richtig an?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 12:35 Nach oben    #6
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Jau, wenn ich nun www.example.com/test/{sample/} aufrufe erhalte ich die Ausgabe:
Code:
IndexController::indexAction
Wende ich das falsche an? Antwort ist wohl ja und die interessantere Frage ist: Wie wende ich es richtig an?
Leider habe ich momentan keine Zeit es selbst zu testen, aber folgende
Einführung könnte dich weiterbringen. Einstieg in das Zend Framework [pdf]

Da wird folgendes vorgeschlagen.
PHP-Code:
$router = new Zend_Controller_RewriteRouter();
$baseUrl substr($_SERVER['PHP_SELF'], 0,
strpos($_SERVER['PHP_SELF'], '/index.php'));
$router->setRewriteBase($baseUrl); 
Falls das nicht klappen sollte, kann dir vieleicht diese Information
weiterhelfen:
Zitat:
Sollte es Probleme geben eine andere Action außer „index/index“
auszuführen, hängt das meistens damit zusammen, dass der
Routing-Mechanismus des Zend Framework nicht herausfinden kann, in
welchem Unterverzeichnis die Anwendung, respektive die index.php, liegt.
Meinen Nachforschungen zufolge passiert das meistens dann, wenn sich die
URL zu der Anwendung zu dem vom DocumentRoot zur Anwendung hin
unterscheidet. Aktuell versuchen wir das mit dem Inhalt von
$_SERVER['PHP_SELF'] herauszufinden. Sollte das nicht helfen, trage bitte
den Pfad von Hand in die Variable $baseUrl ein.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 16:45 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Oah Mann. ,
also ich habe das nun mal ausgetestet.

Folgende Situation habe ich
PHP-Code:
class IndexController extends Zend_Controller_Action {
    
    
    
/**
     *  
     */
    
public function indexAction() {
        echo 
__METHOD__ '<br />';
        
        
    }
    
    
    
/**
     * Wird aufgerufen, wenn zwar ein Controller im URL existiert, aber keine "Action".
     * 
     * @param string $methodName
     * @param array  $arguments
     */
    
public function __call($methodName$arguments) {
        echo 
__METHOD__ '<br />';
    }
    
    
    
/**
     * Wird aufgerufen, wenn kein Controller im URL vorhanden ist.
     */
    
public function norouteAction() {
        echo 
'<pre>'
        
debug_print_backtrace(); 
        echo 
'</pre>';
        
        echo 
__METHOD__ '<br />';
    }
    

index.php
PHP-Code:
require_once('../prepend.inc.php');


$router = new Zend_Controller_RewriteRouter();
$baseUrl substr($_SERVER['PHP_SELF'], 0strpos($_SERVER['PHP_SELF'], '/index.php'));
Zend::Dump($baseUrl); // string(0) ""
$router->setRewriteBase($baseUrl);  

$router->addRoute
    
'test'
    new 
Zend_Controller_Router_Route('test/:title', array('controller' => 'test''action' => 'showTitle')) 
); 

$controller Zend_Controller_Front::getInstance();

$controller->setRouter($router);
$controller->setControllerDirectory($controllerDir);
$controller->dispatch(); 
in prepend.inc.php wird nur z.B. der include_path gesetzt.

PHP-Code:
class TestController extends Zend_Controller_Action {
    
    public function 
indexAction() {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
__call($methodName$arguments) {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
showTitleAction() {
        echo 
__METHOD__ '<br />';
    }

Zusätzlich habe ich einen vHost in meinem XAMPP eingerichtet mit folgenden Anweisungen:
Code:
<VirtualHost *:80>
    ServerName www.test.xy
    DocumentRoot "C:/apachefriends/xampp/htdocs/zendtest/public/"
    ErrorLog logs/zendtest-error_log
    CustomLog logs/zendtest-access_log common
</VirtualHost>
Wenn ich nun folgenden URL aufrufe: www.test.xy/test/ erhalte ich folgende Meldung:
Code:
string(0) ""

#0  IndexController->norouteAction() called at [C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Action.php:118]
#1  Zend_Controller_Action->run(Zend_Controller_Dispatcher Object ([] => C:/apachefriends/xampp/htdocs/zendtest\app/controllers), Zend_Controller_Dispatcher_Token Object ([] => index,[] => noRoute,[] => Array ([error] => Zend_Controller_Router_Exception Object ([] => Request could not be mapped to a route.,[] => ,[] => 0,[] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\RewriteRouter.php,[] => 160,[] => Array ([0] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Front.php,[line] => 231,[function] => route,[class] => Zend_Controller_RewriteRouter,[type] => ->,[args] => Array ([0] => Zend_Controller_Dispatcher Object ([] => C:/apachefriends/xampp/htdocs/zendtest\app/controllers))),[1] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\public\index.php,[line] => 27,[function] => dispatch,[class] => Zend_Controller_Front,[type] => ->,[args] => Array ())))))) called at [C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Dispatcher.php:185]
#2  Zend_Controller_Dispatcher->_dispatch(Zend_Controller_Dispatcher_Token Object ([] => index,[] => noRoute,[] => Array ([error] => Zend_Controller_Router_Exception Object ([] => Request could not be mapped to a route.,[] => ,[] => 0,[] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\RewriteRouter.php,[] => 160,[] => Array ([0] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Front.php,[line] => 231,[function] => route,[class] => Zend_Controller_RewriteRouter,[type] => ->,[args] => Array ([0] => Zend_Controller_Dispatcher Object ([] => C:/apachefriends/xampp/htdocs/zendtest\app/controllers))),[1] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\public\index.php,[line] => 27,[function] => dispatch,[class] => Zend_Controller_Front,[type] => ->,[args] => Array ()))))), 1) called at [C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Dispatcher.php:136]
#3  Zend_Controller_Dispatcher->dispatch(Zend_Controller_Dispatcher_Token Object ([] => index,[] => noRoute,[] => Array ([error] => Zend_Controller_Router_Exception Object ([] => Request could not be mapped to a route.,[] => ,[] => 0,[] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\RewriteRouter.php,[] => 160,[] => Array ([0] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Front.php,[line] => 231,[function] => route,[class] => Zend_Controller_RewriteRouter,[type] => ->,[args] => Array ([0] => Zend_Controller_Dispatcher Object ([] => C:/apachefriends/xampp/htdocs/zendtest\app/controllers))),[1] => Array ([file] => C:\apachefriends\xampp\htdocs\zendtest\public\index.php,[line] => 27,[function] => dispatch,[class] => Zend_Controller_Front,[type] => ->,[args] => Array ())))))) called at [C:\apachefriends\xampp\htdocs\zendtest\lib\zf\Zend\Controller\Front.php:254]
#4  Zend_Controller_Front->dispatch() called at [C:\apachefriends\xampp\htdocs\zendtest\public\index.php:27]

IndexController::norouteAction
Zitat:
Request could not be mapped to a route
Das ist ja der Knackpunkt.

Ich weiß gerade echt nicht mehr weiter.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.12.2006, 18:55 Nach oben    #8
Benutzer
 
Benutzerbild von chrigu
 
Registriert seit: 18.09.2006
Beiträge: 50
Standard

Funktioniert die Standard-Route?
Füge mal explizit keine Route hinzu, somit wird die Default-Route verwendet.
Kannst du dann test.xy/test/showtitle aufrufen?

Gruss,
Chrigu
chrigu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.12.2006, 14:02 Nach oben    #9
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Zitat:
Zitat von chrigu Beitrag anzeigen
Füge mal explizit keine Route hinzu
Was meinst du?

Also das hier klappt:
PHP-Code:
class TestController extends Zend_Controller_Action {
    
    
    public function 
indexAction() {
        echo 
__METHOD__ '<br />';    
    }
    
    
    public function 
__call($methodName$arguments) {
        echo 
__METHOD__ '<br />';
        
Zend::Dump($methodName);
        
Zend::Dump($arguments);
    }
    
    
    public function 
createAction() {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
deleteAction() {
        echo 
__METHOD__ '<br />';
    }
    
    public function 
showTitleAction() {
        echo 
__METHOD__ '<br />';    
    }
    
    
    public function 
updateAction() {
        echo 
__METHOD__ '<br />';
    }
    

Beim Aufruf von www.test.xy/test/ wird die Methode indexAction() aufgerufen.
Aber wie gesagt .. ich würde halt gerne einen URL der Form http://www.test.xy/kategorie/1234,da...-beispieltitel haben ..

Geändert von Ben (21.12.2006 um 14:10 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.12.2006, 10:16 Nach oben    #10
Benutzer
 
Benutzerbild von chrigu
 
Registriert seit: 18.09.2006
Beiträge: 50
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Aber wie gesagt .. ich würde halt gerne einen URL der Form www.test.xy/kategorie/1234,das-hier-ist-ein-beispieltitel haben ..
Ungetestet
PHP-Code:
new Zend_Controller_Router_Route(':kategorie/:id,:titel', array('controller' => 'deinController''action' => 'deineAction')) 
Gruss,
Chrigu
chrigu ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.12.2006, 17:58 Nach oben    #11
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Es wäre mir ehrlich gesagt sehr lieb, wenn du es mal austesten könntest, dass funktioniert bei mir nämlich nicht. Die Zeile hatte ich natürlich auch schon mal ausgetestet.

PHP-Code:
$router->addRoute
    
'test'
    new 
Zend_Controller_Router_Route(':test/:id,:titel', array('controller' => 'TestController''action' => 'showTitle')) 
); 
Dabei ist es völlig egal, ob ich "showTitle" oder "showTitleAction" bzw. "Test" oder "TestController" nutze ...

Wie gesagt .. ich wäre über ein lauffähiges Beispiel überaus dankbar!
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.12.2006, 18:15 Nach oben    #12
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Nachtrag:
Dank WarrenFaith bin ich auf das hier gestoßen.

Fazit daraus: Das liegt an dem Komma!

Das hier funktioniert
PHP-Code:
$router->addRoute
    
'test'
    new 
Zend_Controller_Router_Route(':test/:id/:title', array('controller' => 'Test''action' => 'showTitle')) 
); 
Das hier nicht
PHP-Code:
$router->addRoute
    
'test'
    new 
Zend_Controller_Router_Route(':test/:id,:title', array('controller' => 'Test''action' => 'showTitle')) 
); 
Hmm, muss ich ma suchen, ob man das eventuell irgendwie "escapen" kann oder so ..


[EDIT]
Eventuell hilft mir das hier: http://framework.zend.com/wiki/displ...+RewriteRouter
Zitat:
MJS_Controller_Router_PathRoute is a rewrite of Zend_Controller_Router_Route. It was written to address the shortcomings in Zend_Controller_Router_Route. Mainly the fact that variables could only be separated by a '/' and parameters could not be captured as a string but only a key/value combination. MJS_Controller_Router_PathRoute is 100% backwards compatible with the most recent Zend_Controller_Router_Route in SVN so you can use it with either MJS_Controller_PathRouter or Zend_Controller_RewriteRouter.
Werde das mal austesten.


[EDIT]
Habe es noch nicht ausgetestet, aber die Doku da sieht vielversprechend aus ... ich werde berichten.

Geändert von Ben (23.12.2006 um 05:18 Uhr).
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.12.2006, 17:17 Nach oben    #13
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Noch ein Nachtrag.

Ich habe diese Frage mal in das neu eröffnete, inoffizielle deutsche Supportforum zum Zend Framework übertragen und habe dort auch schon erste hilfreiche Antworten erhalten.

Wenn jemand von Euch weitere Hilfestellung hat, können diese natürlich auch in diesem Thread hier geschrieben werden. Ich freue mich weiterhin über jede Antwort.

Grüße, Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zend Framework 1.0.0 RC 2 veröffentlicht Ben Nachrichten 0 11.06.2007 08:13