Поведение маршрутизатора Zend

У меня проблемы с роутером.

У меня есть собственный маршрут:

$router->addRoute('showTopic',
                      new Zend_Controller_Router_Route('/forum/topic/:topic',
                                        array('module' => 'forum',
                                              'controller' => 'topic',
                                              'action' => 'show'),
                                        array('topic' => '\d+'))); 

Но когда я пытаюсь получить доступ к этому URL-адресу: localhost/forum/topic/16, я получаю эту ошибку:

Неустранимая ошибка: необработанное исключение «Zend_Controller_Router_Exception» с сообщением «тема не указана»

Но я не хочу указывать значение по умолчанию для темы, потому что я также хочу, чтобы маршрут /форум/тема отображал все темы...

Во-вторых, я знаю, что если я добавлю пользовательский маршрут, маршрутизатор по умолчанию будет переопределен, но мне также нужны некоторые маршруты по умолчанию. Единственный способ, который я нашел, - установить «по умолчанию» во втором параметре помощника просмотра URL, например

$this->url(array(
                 'module' => 'forum',
                 'controller' => 'topic',
                 'action' => 'add'
                ), 'default', true)

Есть ли более элегантный способ вместо того, чтобы делать это для всех URL-адресов, где я хочу использовать поведение по умолчанию?


person Peekyou    schedule 23.12.2011    source источник
comment
Я не могу придумать лучшего способа!   -  person Lenin Raj Rajasekaran    schedule 24.12.2011


Ответы (1)


У вас должно быть значение по умолчанию для темы и добавление более общего маршрута (для форума/темы) после более конкретного. Route_Rewrite проверяет маршруты, начинающиеся с последнего (на самом деле это array_inverse).

Помощник url ​​делегирует URL-адреса сборки маршруту, его вторым параметром является имя маршрута, который нужно получить от маршрутизатора. Поскольку маршрут по умолчанию зарегистрирован под именем default, в использовании этого имени нет ничего некрасивого (это не волшебная строка и не особый случай). Если это вас действительно беспокоит, вы можете написать собственный помощник (который будет помещен в «представления/помощники»):

class Zend_View_Helper_DefaultUrl extends Zend_View_Helper_Abstract {
   public function defaultUrl($params) {
      return $this->view->url($params, 'default');
   }
}

И используйте его в своем представлении, например defaultUrl(array('action'=>'test')) ?>.

person fdreger    schedule 25.12.2011