zentner: Zend Framework - Router - statische Seiten

Schönen Mittag Selfer,

ich möchte Zend so einrichten, dass ich zwei Controller habe, die wie folgt angesprochen werden sollen:

example.de/controller-1/action-1
example.de/controller-2/action-2
usw.

Also bis hier das ganz übliche Routing von Zend Framework.

Nun habe ich jedoch einen Controller, der für die Ausgabe von statischen Seiten zuständig ist (Impressum, AGB, etc.). Diese möchte ich wie folgt ansprechen können:

example.de/impressum
example.de/agb

Wie kann ich das erreichen? Der erste Teil der URL soll als Action des staticController interpretiert werden, wenn kein entsprechender Controller existiert.

So funktioniert es ja nicht:

$router->addRoute('',
    new Zend_Controller_Router_Route(':static')
);

Im Prinzip stört es mich ohnehin schon, dass ich für alle statischen Seiten auf diese Weise ja eine Action anlegen muss, aber im Prinzip jede Action das selbe macht: den entsprechenden Datensatz aus der DB laden.

Gruß

zentner

  1. Hallo,

    das Problem hatte ich auch mal, 2008. Da wollte ich

    example.com/artistname direkt ansprechen.

    Das Problem, aber vermutlich lösbar, ist, dass du dafür kein "pattern" hast. Einfacher wäre example.com/artist/artistname (artistname halt variabel).

    Also überlege Dir doch, ob du nicht example.com/static als route belegen willst. Dann kannst du definieren, dass examplec.com/static/wasauchimmer dann das "wasauchimmer" als in der Route festgelegte variable wird, und in der Route festlegen, dass das immer auf static-controller default-action geroutet wird.

    Ich hatte das damals als .ini definiert:

    routes.kategorielistemore.route = ":Kategorie/Liste/*"
    routes.kategorielistemore.defaults.controller = index
    routes.kategorielistemore.defaults.action = index
    routes.kategorielistemore.defaults.liste = liste
    routes.kategorielistemore.defaults.route_name = kategorie_liste__more_from_config

    Blicks aber nicht mehr so ganz momentan. S.a. http://framework.zend.com/manual/en/zend.controller.router.html

    Deine Lösung interessiert mich. Bin heute etwas eng mit der Zeit, könnte aber nochmal mein Archiv durchforsten. Die Routingregeln werden von speziell nach allgemein durchgeforstet. Will wohl heißen: wenn nix mehr übrig bleibt, greift die allgemeine. Insofern sollte es möglich sein, das letzte übrig
    gebliebene Pattern einem Standard Controller-Action zuzuordnen.

    Gruß

    jobo

    1. Hallo,

      es gibt ja auch irgendwie statische Routen.

      Auszug aus einer Zend-Beispiel.ini:

      news.type = "Zend_Controller_Router_Route_Static"
      news.route = "news"
      news.defaults.controller = "news"
      news.defaults.action = "list"

      Gruß

      jobo

      1. es gibt ja auch irgendwie statische Routen.

        Das habe ich auch schon gesehen, aber ich will ja nicht unbedingt für jede statische Seite eine Route definieren müssen - wäre dann wie der mod_rewrite-Workauround und nicht im Sinne vom schönen Zend Framework ...

        Letztendlich brauche ich eine Route, die
        example.de/kein-controller-name

        auf staticController -> showStaticContent -> Variable: kein-kontroller-name
        schiebt.

        Alles andere soll laufen wie Zend Standard.

        1. Hallo,

          Letztendlich brauche ich eine Route, die
          example.de/kein-controller-name

          auf staticController -> showStaticContent -> Variable: kein-kontroller-name
          schiebt.

          Alles andere soll laufen wie Zend Standard.

          Meines Erachtens ist das so:

            
                $router->addRoute('user',  
                                  new Zend_Controller_Router_Route('user/:username'));  
          
          

          Heißt:

          wenn example/user/abc aufgerufen wird, dann wird die Index-Action des UserControlles aufgerufen und der Parameter "username" in meinem Fall auf "abc" gesetzt.

          Das dürfte doch deinen Anforderungen schon genügen.

          Oder ohne Parameter:

            
                $route = new Zend_Controller_Router_Route_Static(  
                    'login',  
                    array('controller' => 'auth', 'action' => 'login')  
                );  
                $router->addRoute('login', $route);  
          
          

          Ich vermute mal, das du da als ersten Parameter auch ein Array eingeben kannst.

          $front->setParam('useDefaultControllerAlways', true); wäre auch eine Variante, die dort erwähnt wird. Dann musst du aber die URL nochmal selbst auslesen, weil du nicht automatisch die Parameter erhältst, würde ich meinen.

          http://framework.zend.com/manual/de/zend.controller.router.html#zend.controller.router.routes.static

          Gruß

          jobo

  2. Ein möglicher Workaround wäre ja, die Standard mod_rewrite-Rule für Zend Framework zu ergänzen.

    Und zwar die endliche Anzahl an "statischen Seiten" mit den URLs:
    example.de/statische-Seite
    abzufangen und intern auf
    example.de/statische-Seiten/ausgeben/statische-Seite

    Alles andere mit der Standard Zend-Framework Rule auffangen controller/actin ...

    1. ... der View Url Helper hilft einem dann aber nichtmehr bei der Generierung der Links ...

      1. Hallo,

        ... der View Url Helper hilft einem dann aber nichtmehr bei der Generierung der Links ...

        wieso legst du keine statische Route?

        Gruß

        jobo

  3. Hat keiner eine bessere Idee als endlich viele statische Routen anzulegen?

    Wenn nicht, wie kann man mit einem Controller und einer Action alle statischen Routen (impressum, agb, etc.) versorgen?

    $route = new Zend_Controller_Router_Route_Static(
              'impressum',
              array('controller' => 'static', 'action' => 'show')
          );

    Ich möchte in diese Fall die statische Route für impressum auf den staticController und die showAction mit einem parameter impressum aufrufen. Für die agb dann entsprechend die showAction des staticControllers mit einem parameter agb aufrufen.

    Gruß

    1. Mit lauter statischen Routen wie:

      $route = new Zend_Controller_Router_Route_Static(
                'impressum',
                array('controller' => 'static',
                      'action' => 'show',
                      'staticpage' => 'impressum')
            );

      $route = new Zend_Controller_Router_Route_Static(
                'agb',
                array('controller' => 'static',
                      'action' => 'show',
                      'staticpage' => 'agb')
            );

      Könnte ich Aufrufe von
      example.de/impressum und example.de/impressum/
      example.de/agb und example.de/agb/

      je auf die show-Action des static-Controllers leiten und die Variable staticpage übergeben, anhand derer die show-Action die richtige Seite generieren kann.

      Mit dieser Lösung müsste auch der URL-View-Helper seinen Dienst leisten, richtig?

      Einzig dumm nur, dass ich so händisch mehrere Routen einpflegen muss für jede Seite ... vielleicht kann man das noch optimieren?

      Grüße

      P.S.: Zählt die Erreichbarkei einer Seite mit endendem / oder ohne jetzt eigentlich als doppelter Content? Und die Erreichbarkeit mit . hinter der TLD und ohne (also example.de./agb/)?

      1. Hallo,

        wie gesagt, mach

        example.com/statik/:deineseite

        dann wird "deineseite" als parameter übergeben. hatte ich dir schon ein beispiel genannt.

        der slash am ende spielt m.w. keine rolle. wird der nicht vom server ergänzt?

        Gruß

        jobo

        1. Ich suche aber nach einer Lösung ohne das "statik"! Das möchte ich aus der URL haben. Dafür taugt deine Lösung nicht. Meine würde funktionieren ist jedoch unschön, da man für jede statik-Seite eine route anlegen muss.

          1. Hallo,

            Ich suche aber nach einer Lösung ohne das "statik"! Das möchte ich aus der URL haben. Dafür taugt deine Lösung nicht. Meine würde funktionieren ist jedoch unschön, da man für jede statik-Seite eine route anlegen muss.

            Eben. Aber vielleicht findest du ja doch eine sinnvolle Gruppierung. info/abg
            info/impressum info/kontakt. Du brauchst ja irgendwas in der URL, damit du sie rausfischen bzw. eben identifizieren kannst. Sonst musst du das eben alles einzeln auflisten. Oder Du kannst eine DefaultRoute legen, falls ein Controller-Action-Paar nicht gefunden wird...???

            Gruß

            jobo

            1. Oder Du kannst eine DefaultRoute legen, falls ein Controller-Action-Paar nicht gefunden wird...???

              Dann wäre die Funktin des View-URL-Helpers aber auch hinüber..

        2. Hi!

          der slash am ende spielt m.w. keine rolle. wird der nicht vom server ergänzt?

          Jein. Er wird ergänzt, wenn der Apache feststellt, dass der Pfad der URL genau auf einen im Dateisystem passt. Ansonsten passiert das nicht. Das Verhalten ist über DirectorySlash konfigurierbar. Und er wird auch nicht nur ergänzt sondern ein Redirect auf die um den / ergänzte URL an den Browser geschickt.

          Lo!

          1. Sprich bei Zend Framework dürfte er nicht automatisch ergänzt werden, da es sich ja nicht um Pfade auf dem Server handelt, sondern um eine Repräsentation von Controller und Action?

            Aber zählt das jetzt als doppelter Content?

            example.de
            example.de.
            example.de/
            example.de./
            example.de/index
            example.de/index/

            1. Hi!

              Sprich bei Zend Framework dürfte er nicht automatisch ergänzt werden, da es sich ja nicht um Pfade auf dem Server handelt, sondern um eine Repräsentation von Controller und Action?

              Exakt. Aber was hält dich davon ab, es kurz selbst zu probieren?

              Aber zählt das jetzt als doppelter Content?

              Wem gegenüber? Google? Lies deren Informationen in der Webmaster-Zentrale zum Thema Duplicate Content.

              Lo!