Поведение 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" с сообщением "тема не указана"

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

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

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам