2012-05-13 3 views
0

Я определяю маршруты регулярных выражений для очистки моих URL. Идея состоит в том, что все страницы, добавленные пользователем, будут использовать URL www.example.com/page-slug, а не использовать фактический контроллер, www.example.com/userpages/page-slug. Другие страницы будут следовать стандартным модулю: controller: схема маршрутизации действий.Regex Routing - правило не найдено

Я пытаюсь сделать это с использованием приоритета маршрутизатора.

Я определил схему ниже ..

class Default_Bootstrap extends Zend_Application_Module_Bootstrap{ 

protected function _initRoute() { 

    $front = Zend_Controller_Front::getInstance(); 
    $router = $front->getRouter(); // returns a rewrite router by default 

    $route['index'] = new Zend_Controller_Router_Route_Regex(
     '/', 
     array(
     'module'  => 'default', 
     'controller' => 'index', 
     'action'  => 'index' 
     ) 
    ); 
    $route['contact'] = new Zend_Controller_Router_Route_Regex(
     'contact/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'contact', 
     'action'  => 'index' 
     ) 
    ); 
    $route['research'] = new Zend_Controller_Router_Route_Regex(
     'research/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'research', 
     'action'  => 'index' 
     ) 
    ); 
    $route['account'] = new Zend_Controller_Router_Route_Regex(
     'account/(\d+)', 
     array(
     'module'  => 'default', 
     'controller' => 'account', 
     'action'  => 'index' 
     ) 
    ); 
    $route['userpages'] = new Zend_Controller_Router_Route_Regex(
     '/(.+)', 
     array(
     'module'  => 'default', 
     'controller' => 'userpages', 
     'action'  => 'index' 
     ), 
     array(
     'slug' => 1 
     ), 
     '%s' 
    ); 

    $router->addRoute('userpages',  $route['userpages']); 
    $router->addRoute('contact',  $route['contact']); 
    $router->addRoute('research',  $route['research']); 
    $router->addRoute('account',  $route['account']); 
    $router->addRoute('index',   $route['index']); 

} 

} 

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

Message: Invalid controller specified (about-us) 
. 
. 
. 
Request Parameters: 

array (
    'controller' => 'about-us', 
    'action' => 'index', 
    'module' => 'default', 
) 

Любая идея, где я собираюсь здесь не так? Мне кажется, что регулярное выражение является правильным: «/(.+)« следует ловить все, что не является индексной страницей.

EDIT: @phatfingers, ОК, вы правы, я редактировал «\ d +» на «. +», Чтобы поймать один или несколько символов. Проблема сохраняется. Фактически перед изменением регулярного выражения я попробовал URL-адрес www.example.com/52 и получил ту же ошибку - «Неверный контроллер указан (52)». После изменения - с кодом в соответствии с отредактированным фрагментом выше, правило все еще не находит совпадений.

+0

Регулярное выражение "(\ d +)" соответствует только цифрам. Пример URL-адреса «www.example.com/page-slug» не заканчивается цифрами. – phatfingers

+0

спасибо за наблюдение @phatfingers, см. Мое редактирование выше - правило все еще не соответствует ожидаемому – NaNuk

+0

Я думаю, что вам нужно отбросить косую черту в регулярном выражении 'userpages', то есть просто '('. +)' –

ответ

0

Отбросьте слэш в регулярном выражении «userpages», то есть только (. +)

цитата прямо из ручного Zend Router и Router_Regex но AFAIK это также относится ко всем маршрутам.

Примечание: Перед началом матча ведущие и конечные косые черты обрезаются с URL-адреса маршрутизатора . В результате сопоставление URL http://domain.com/foo/bar/ будет включать регулярное выражение foo/bar, а не /foo/bar.

Смежные вопросы