2010-12-31 8 views
5

Jestem początkującym programistą Zend Framework i próbuję ustalić, jak dodać kolejną trasę do mojego pliku application.ini.Ustawianie tras w application.ini w Zend Framework

Obecnie mam moje trasy skonfigurować w następujący sposób:

resources.router.routes.artists.route = /artists/:stub 
resources.router.routes.artists.defaults.controller = artists 
resources.router.routes.artists.defaults.action = display 

... tak, że /Artyści/joe-Kowalski wykorzystuje „display” działania „artystów” kontroler do dipslay profil artysta, o którym mowa - to działa dobrze.

Chcę teraz ustawić inną trasę, aby /artists/joe-bloggs/random-gallery-name trafiło do akcji "galerie" kontrolera "artyści".

Próbowałem dodanie dodatkowego bloku do pliku application.ini (pod blokiem powyżej) tak:

resources.router.routes.artists.route = /artists/:stub/:gallery 
resources.router.routes.artists.defaults.controller = artists 
resources.router.routes.artists.defaults.action = galleries 

... ale kiedy to robię, że strona na /Artyści/Joe-Bloggs nie działa (Zend próbuje przekierować go do kontrolera "joe-bloggs").

Jak skonfigurować trasy w pliku application.ini, aby można było zmienić działanie kontrolera "artyści" w zależności od tego, czy istnieje "/: galeria"?

Zdaję sobie sprawę, że prawdopodobnie popełniłem naprawdę głupi błąd, więc proszę o wskazanie mojej głupoty i postawienie mnie na właściwej ścieżce (gra słów nie jest przeznaczona).

Odpowiedz

4

Spróbuj odwrócić kolejność tras. ZF dopasowuje trasy w odwrotnej kolejności, w jakiej są one dodawane (tak, że domyślna trasa jest ostatnia do dopasowania)

Jeśli to nie zadziała, prawdopodobnie będziesz musiał zbadać trasy regex z opcjonalnymi komponentami.

1

zwykle konfiguracja moich tras w aplikacji/bootstrap.php (lub gdziekolwiek plik bootstrap.php jest)

dodać metodę jak poniżej:

protected function _initRoutes() 
{ 
    $ctrl = Zend_Controller_Front::getInstance(); 
    $router = $ctrl->getRouter(); 
    $router->addRoute(
      'artist_detail', 
      new Zend_Controller_Router_Route('artists/:stub', 
              array('controller' => 'artists', 
                'action' => 'display')) 
    ); 

    $router->addRoute(
      'artist_detail_gallery', 
      new Zend_Controller_Router_Route('artists/:stub/:gallery', 
              array('controller' => 'artists', 
                'action' => 'gallery')) 
    ); 



} 

Jeśli chodzi o sprawdzenie pogody An specyficzny artysta ma galerię, w przypadku moim przykładzie, musiałbym metodę galleryAction w ArtistsController

zrobić sprawdzenie, czy istnieje galeria dla „skrótowej” Wniosek paramater, jeśli nie robi rzucić 404:

throw new Zend_Controller_Action_Exception("Object does not exist", 404); 

lub przekierować je do innej strony:

return $this->_helper->redirector('index', 'index'); //redirect to index action of index controller 

nadzieję, że to pomaga.

+0

wolę to jako rozwiązanie routingu, jest dużo bardziej gadatliwy i łatwiejsze do zrozumienia niż umieszczenie go w aplikacji.ini – jolyonruss

+1

@jolyonruss, z drugiej strony nie –

3

Twój drugi blok musi mieć inną nazwę trasy, zmienić słowo „artystów”, aby coś podobnego do tego na swoim nowym bloku:

resources.router.routes.artists-gal.route = /artists/:stub/:gallery 
resources.router.routes.artists-gal.defaults.controller = artists 
resources.router.routes.artists-gal.defaults.action = galleries