PHP Sammelthread: Zend Framework und alles was dazugehört

Darüber habe ich mir ja schon die Parameter geholt und dann mitgeloggt um zu sehen, welche Parameter der bekommt.

Wenn ich /de aufrufe sehe ich nur den language-Parameter, wenn ich /de/index aufrufe allerdings alle: controller, action, module, language.
Kann es sein, dass der Router bei /de nur die language-Route benutzt und da diese keine module/controller/action-Parameter hat, gibt es diese auch nicht?

Im Grunde möchte ich ja die Standardrouten haben und davor soll es die Möglichkeit geben, dass dort die Sprache angegeben wird. In einem Tutorial im Internet (Link habe ich jetzt gerade nicht zur Hand) wurden die Routen so definiert, wie ich diese habe.. Ist ja im Prinzip das, was ich haben möchte. Die Standardrouten über die Zend_Controller_Router_Route_Module-Instanz und das wird verbunden mit meiner Sprachroute.
 
also wenn ich den root Aufrufe "/" erhalte ich:
Code:
module=default, controller=index, action=index
so wie es sein sollte.

Ich vermute mal deine komische Definition des $routeModule, die ich nicht nachvollziehen kann, macht dir einen Strich durch die Rechnung.
 
Ich vermute mal deine komische Definition des $routeModule, die ich nicht nachvollziehen kann, macht dir einen Strich durch die Rechnung.

PHP:
    public function addDefaultRoutes()
    {
        if (!$this->hasRoute('default')) {
            $dispatcher = $this->getFrontController()->getDispatcher();
            $request = $this->getFrontController()->getRequest();

            require_once 'Zend/Controller/Router/Route/Module.php';
            $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request);

            $this->_routes = array_merge(array('default' => $compat), $this->_routes);
        }

        return $this;
    }

So sieht die Definition für die Standardroute in der Zend/Controller/Router/Rewrite.php aus.
Das ist ja theoretisch die identische Definition wie meine. Nur weiß ich gerade nicht, wie das mit dem Dispatcher bzw. Request aussieht, sobald diese Methode aufgerufen wird. Ob das nun gleichwertig ist wie bei meiner Definition.
Bei mir werden die Routen in einer entsprechenden Bootstrap-Datei angelegt.

EDIT: Das hier hatte ich mir angeschaut: https://www.m4d3l-network.com/2009/06/29/add-language-route-to-your-zend-framework-project/
Kleiner Unterschied zu meiner Definition ist, dass dort für die Modulroute das Attribut abstract angeschaltet wird. Wenn ich das mache, gibt es allerdings weitere Probleme.. (mom)

EDIT2: Also wenn ich es einschalte funktioniert /index nicht mehr, dann findet der keine passende Route mehr. (Ist auch logisch wenn ich das richtig verstanden habe, durch das Attribut wird ja anscheinend die Route nicht mehr einzeln benutzbar gemacht)
 
Zuletzt bearbeitet:
Wie wäre es denn mit sowas in der Art:
PHP:
$route = new Zend_Controller_Router_Route(
  ':language/:module/:controller/:action/*',
  array(
    'language'   => 'de',
    'module'     => 'default',
    'controller' => 'index',
    'action'     => 'index'
  )
);

$router->addRoute('default', $route);
ich glaube sowas wäre ne deutlich zielstrebigere Ansatzweise. Zusammen mit den Translation-Erweiterungen im Router (an die ich mich gerade nicht erinnern kann) könnte man das noch aufpeppen.
Ich würde mal in solch eine Richtung nach Ansätzen googlen.
 
Bei so einer Route hat man aber das Problem, dass die Reihenfolge immer language, module, controller, action sein muss. Falls man nun das Modul weglassen möchte (was bei der Standardroute ja geht) funktioniert das nicht mehr.
Daher habe ich den Ansatz am Anfang auch vorerst verworfen...

Und diese Klasse Zend_Controller_Router_Route_Module sorgt ja dafür, dass so etwas möglich ist indem überprüft wird, ob die erste Angabe ein mögliches Modul ist, wenn ja, wird das als Modul genommen, wenn nein, wird überprüft ob es ein Controller ist.

  • :language/defaultRoute
  • defaultRoute
  • :language

So etwas soll ja bei mir möglich sein.. Ist es auch alles, aber wenn.. moment (!)

Ah, yes!


PHP:
$routeLanguage = new Zend_Controller_Router_Route(
	':language',
	array(
        'language'   => false,
	    'module'     => 'default',
	    'controller' => 'index',
	    'action'     => 'index'
	),
	array(
		'language' => '^(de|en)$'
	)
);

lautet nun meine Sprachroute.. ganz simpel die Standardangaben hinzugefügt, falls nur diese Route matched.

Sieht vorerst so aus, als wenn es läuft :)
Wie hilfreich doch das Schreiben solcher Posts sein kann...
 
Da defaults angegeben sind, muss das module nicht angegeben werden, wenn ich mich recht entsinne. Denn eigentlich müsste bis auf das language dies die default-Rule des ZF sein.
 
Da defaults angegeben sind, muss das module nicht angegeben werden, wenn ich mich recht entsinne. Denn eigentlich müsste bis auf das language dies die default-Rule des ZF sein.

Wenn ich kein Modul angebe und mit deiner Route /de/index oder so aufrufe meckert der rum. 'index' wird dann dem Modul zugeordnet und die restlichen Angaben fehlen.. ;)
Die default-Route des ZF sollte wie man in dem von mir geposteten Auszug sieht über Zend_Controller_Router_Route_Module gelöst werden.
 
Hallo,

so nach langer Zeit habe ich mir jetzt das Buch von Ralf Eggert zum Zend Framework gekauft.

Und nun stehe ich bei der Umsetzung eines Projekts vor einem kleinen Problem.
Es geht um modulspezifisches routing. ( Hab gesehen, dass es hier grad auch um soetwas in der art geht ;) )

Problem ist folgendes:
Ich habe ein Plugin geschrieben, dass mit der routeStartup funktion überprüft welche module eine route.ini datei besitzen. Wenn die Datei existiert soll damit eine route angelegt werden.

So nun habe ich das default und ein Admin Modul und beide besitzen besagte Datei. Das Problem liegt jetzt darin, dass die route des Adminmoduls die route meines Defaultmoduls überschreibt, und ich grade nicht dahinter komme wie ich das umgehen kann.

das sind die beiden Inis:
default:
PHP:
default.route = ":url_key/*"
default.defaults.module = "default"
default.defaults.controller = "index"
default.defaults.action = "index"

admin:
PHP:
admin.route = ":module/:controller/:action/*"
admin.defaults.module = "admin"
admin.defaults.controller = "index"
admin.defaults.action = "index"

Jemand eine Idee?

mfg Raze
 
Was erhoffst du dir von solch einer Deklaration?
Mach die Admin-Definition weg, Module werden auch richtig geroutet, du musst sie in der URL nur eben angeben.

Deine Definition sagt momentan, wenn kein Module angegeben wird, bedeutet dies, man meint das Admin-Modul, was ja nicht der Fall ist.
 
Deine Definition sagt momentan, wenn kein Module angegeben wird, bedeutet dies, man meint das Admin-Modul, was ja nicht der Fall ist.

Danke für die Antwort.

Ich verstehe es nur noch nicht so ganz. Wenn nur die erste Route existiert,
wird das /admin als parameter behandelt und der indexController vom defaultmodul wird aufgerufen.
d.h das Modul wird nicht gewechselt, oder muss ich an der ersten route nochetwas ändern?

Bin da grad noch etwas überfragt. Ziel ist es aber im Frontend in der url nur parameter zu bekommen und im Adminmodul wieder die defaultroute zu haben :-?
 
Code:
https://example.de/admin/foo/bar

module = admin
controller = foo
action = bar

deinen letzten Paragraphen habe ich nicht verstanden
 
PHP:
		 			 default.route = ":url_key/*"
default.defaults.module = "default"
default.defaults.controller = "index"
default.defaults.action = "index"

bedeutet ja, dass egal wie meine url aussieht der controller und die action immer gleich bleiben. Es ändert sich halt immer nur der parameter "url_key".

Im Admin möchte ich jedoch die default route wiederherstellen.

Ist es so besser zu verstehen?
 
du versuchst da irgendein Mist zusammenbasteln, lass es, die Default-Route sollte nur mit guten Gründen überschrieben werden, und die sind hier sicherlich nicht gegeben.
Beschreib doch mal im Detail was du bewirken willst, wieso, und zu welchem Zweck.
 
Ich versuche bestimmt nicht irgendeinen mist zusammenzubasteln. Wenn ich auf Mist stehen würde hätte ich das Problem schon längst aus der Welt.

Im Grunde geht es darum, dass das Frontend soetwas wie eine profilseite werden soll.

Dazu brauche ich nur einen Parameter, der den User identifiziert. Der Controller und die Action sind immer gleich.

Und anstatt www.example.de/index/index/userid hätte ich natürlich lieber
www.example.de/userid.

mfg
 
Dann veränder nicht die Default-Route sondern füg eine Route hinzu, die auf die userid matcht:
PHP:
$route = new Zend_Controller_Router_Route_Regex(
  '(\d+)',
  array(
    'controller' => 'user',
    'action'     => 'nickpage'
  ),
  array(
    1 => 'userid'
  )
);

$router->addRoute('archive', $route);

das meinte ich mit "Mist", du hast versucht etwas hinzubiegen, wofür es einen ganz normalen Standardansatz gibt. Die Default-Route musste ich noch nie ändern, den einzig sinnvollen Einsatz darin sehe ich nur bei mehrsprachigen Seiten, wie hier vor kurzem auch besprochen wurde.
 
Danke,

ich war mir nicht im klaren, dass ich die default route dadurch überschrieben habe, nun läufts.

mfg
 
ich war mir nicht im klaren, dass ich die default route dadurch überschrieben habe, nun läufts.

Der Router geht alle definierten Routen durch und fängt bei der zuletzt definierten an. Sobald eine Route matched, wird diese benutzt. Also wie du bei dem Code von ice-breaker auch siehst, hat er mittels regulärem Ausdruck hinzugefügt, dass nur eine Zahl nach der URL stehen darf. Das ist ja genau der Fall bei deinem Vorhaben ;)
 
Mh.. irgendwie dachte ich, ich hätte hier schonmal mein aktuelles Problem geschildert. Aber finde das irgendwie gerade nicht.
Also nach ein paar Wochen mache ich nun an meinem ZendFramework Projekt ein wenig weiter.

Folgendes Problem: Ich möchte, dass alle Aufrufe zu meinem IndexController gelinkt werden, falls kein Controller existiert. Das habe ich auch hinbekommen über den Parameter "useDefaultControllerAlways" vom Dispatcher. Nur folgende Stelle im Dispatcher stört mich nun:

PHP:
        $controller = $this->getDefaultControllerName();
        $request->setControllerName($controller)
                ->setActionName(null);
(Controller/Dispatcher/Standard.php:429; ZF 1.10.2)

Dadurch wird ja nun auch im Request der Standardcontroller geschrieben und keine Aktion zugeteilt. Ist soweit auch alles logisch und sinnvoll.. Nur wie erhalte ich nun später in meinem IndexController den eigentlich angewählten Controller und die eigentliche Action?
Denn diese brauch ich wieder. Muss ich die Serveranfrage noch einmal durch meinen Router jagen um da ein ordentliches Requestobjekt herauszubekommen!? Oder wie soll das am gescheitesten ablaufen? Da muss es doch etwas recht simples geben... :-?