Zend framework 正则表达式路由-找不到规则

Zend framework 正则表达式路由-找不到规则,zend-framework,Zend Framework,我正在定义用于清理URL的正则表达式路由。其想法是,用户添加的所有页面将使用URL www.example.com/page-slug,而不是使用实际控制器www.example.com/userpages/page-slug。其他页面将遵循标准模块:控制器:操作路由方案 我正在尝试使用路由器优先级来解决这个问题 我在下面定义了这个方案 class Default_Bootstrap extends Zend_Application_Module_Bootstrap{ protected

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

我正在尝试使用路由器优先级来解决这个问题

我在下面定义了这个方案

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时,例如“about us”,未找到最终的全包路由,导致

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

array (
  'controller' => 'about-us',
  'action' => 'index',
  'module' => 'default',
)  
知道我哪里出了问题吗?在我看来,正则表达式是正确的“/(.+)”应该捕获所有不是索引页的内容


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

在“userpages”正则表达式中删除正斜杠,即just(“.+)

该报价直接来自手册和Router_Regex,但也适用于所有路线

注意:前导斜杠和尾随斜杠是从 比赛前的路由器。因此,匹配URL ,将涉及foo/bar的正则表达式,而不是 /foo/bar


正则表达式“(\d+”仅与数字匹配。示例URL“www.example.com/page slug”不是以数字结尾的。感谢@phatfingers的观察,请参阅我上面的编辑-规则仍然与预期不匹配。我认为您必须在“userpages”正则表达式中删除正斜杠,即只需
('.+)
@Arian World,谢谢。我显然误解了regex参数的工作方式。你的建议行得通,但现在我不确定为什么。我认为需要再看一下手册。