正则表达式路由 - 未找到规则

时间:2012-05-13 15:47:56

标签: zend-framework

我正在定义用于清理URL的正则表达式路由。我们的想法是,用户添加的所有页面都将使用URL www.example.com/page-slug而不是使用实际的控制器www.example.com/userpages/page-slug。其他页面将遵循标准模块:controller:action routing scheme。

我正在尝试使用路由器优先级来确定这一点。

我已经定义了以下方案..

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']);

}

}

通常情况下,路由器优先级确保索引/帐户/研究/联系页面正在拾取正确的控制器。但是,当试图转到“userpages”路由覆盖的URL时,例如“关于我们”,最终捕获的所有路线都没有找到导致......

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

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

知道我哪里错了吗?在我看来,正则表达式是正确的“/(.++”“应该捕获不是索引页面的eveything。

编辑:@phatfingers,好吧你是对的,我已经编辑了“\ d +”到“。+”来捕捉任何一个或多个角色。问题依然存在。实际上在更改正则表达式之前,我尝试了URL www.example.com/52,并得到了相同的错误 - “指定的控制器无效(52)”。更改后 - 使用上面编辑的代码段的代码,规则仍然无法找到任何匹配项。

1 个答案:

答案 0 :(得分:0)

在'userpages'正则表达式中删除正斜杠,即只是('。+)

报价直接来自手册Zend Router和Router_Regex,但是afaik也适用于所有路线。

  

注意:从URL中的URL修剪前导和尾部斜杠   匹配前的路由器。结果,匹配URL   http://domain.com/foo/bar/,将涉及foo / bar的正则表达式,而不是   /富/巴。