Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Routing w zend framework

Witam wszystkich,

mam kolejny problem z zf być moze trywialny ale w google nie mogłem nigdzie na ten temat znaleźć odpowiedzi.

Chodzi o routing a mianowicie helper wysłietlający url'a z routingu.
Obecnie mój przykłądowy routing w routes.ini wygląda tak:


routes.link1.type = "Zend_Controller_Router_Route_Static"
routes.link1.route = "module1/controller1/action1.html"
routes.link1.defaults.module = "module1"
routes.link1.defaults.controller = "Controller1"
routes.link1.defaults.action = "action1"

routes.link2.type = "Zend_Controller_Router_Route_Regex"
routes.link2.route = "module2/controller2/action2,([a-zA-Z0-9\-_\.]+).html"
routes.link2.map.id = 1
routes.link2.defaults.module = "module2"
routes.link2.defaults.controller = "Controller2"
routes.link2.defaults.action = "action2"


w kontrolerze uzyskuje link1 tak:
this->view->url(array(), 'link1', true);


zaś za chiny ludowe nie wiem jak uzyskać dostęp do link2 :/
ma ktoś pomysł ?
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Routing w zend framework

Doloz w konfiguracji taka linijke:


routes.link2.reverse = "module2/controller2/action2,%s.html
Piotr Krajewski

Piotr Krajewski web application
programmer

Temat: Routing w zend framework

dzięki działa, a tak z ciekawości się zapytam (bo nie jestem pewien):

jeżeli mam taki routing:


routes.places.type = "Zend_Controller_Router_Route_Regex"
routes.places.route = "miejsca/?(([a-z\-]+)?/?([a-zA-Z\-]+)?/?([a-zA-Z\-]+)?\.html)?"
routes.places.map.region = 2
routes.places.map.city = 3
routes.places.map.category = 4
routes.places.defaults.module = "guide"
routes.places.defaults.controller = "Object"
routes.places.defaults.action = "places"


chodzi o regexpa dla którego rezultatatów może być kilka np.
http://www.mojastrona.pl/miejsca
http://www.mojastrona.pl/miejsca/jakiesmiejsce.html
http://www.mojastrona.pl/miejsca/jakiesmiejsce/podmiej...
http://www.mojastrona.pl/miejsca/jakiesmiejsce/podmiej...

to czy reverse powinien wyglądać tak:

routes.link2.reverse = "miejsca/?(%s/?%s?/?%s?.html)?

? czy może inaczej bo nie jestem pewien.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Routing w zend framework

Ogólnie każdy typ routera ma swoją metodę na tworzenie ścieżki odwrotnej (reverse). (szczegóły implementacji patrz w klasie routingu w metodzie assembly())
Dla Zend_Controller_Router_Route_Static nie potrzebowałeś podawać parametru reverse, bo Zend wie jak odtworzyć ścieżkę - jest jednoznaczna.

W przypadku Zend_Controller_router_Route_Regex ścieżka odwrotna zależna jest od kilku parametrów wejściowych, dlatego musisz podać jakieś dane i "wzór" dla ścieżki - stąd potrzebny jest parametr reverse.
Tutaj ścieżka odwrotna jest tworzona przy użyciu funkcji vsprintf() - czyli podczas podawania w konfiguracji parametru reverse Twoje wyrażenie nie będzie parsowane jak wyrażenie regularne, tylko jak wyrażene printf

Poprawny parametr wyglądałby tak:

routes.link2.reverse = miejsca/%s/%s/%s.html


Jak widzisz w ten sposób da się utworzyć tylko ten najdłuższy adres.
Masz dwa sposoby aby to poprawić:
1. Zmienić paramer route tak aby przyjmował ścieżki postaci miejsca///.html
2. Rozbić link2 na kilka różnych ścieżek w routingu tak żeby każdy z nich był jednoznaczny.

Następna dyskusja:

Aplikacje oparte na Zend Fr...




Wyślij zaproszenie do