CakePHP在路由中使用Regex变量捕获?

时间:2011-02-11 19:54:35

标签: cakephp mod-rewrite routes cakephp-1.3

在我的CakePHP应用程序中,我设置了如下静态页面:

Router::connect(
    '/terms', 
    array('controller' => 'pages', 'action' => 'display', 'terms')
);

这会将/terms重写为/pages/display/terms以制作更漂亮的较短网址。

现在,如果我想为所有静态页面执行此操作,那将会非常多余:

Router::connect(
    '/terms', 
    array('controller' => 'pages', 'action' => 'display', 'terms')
);
Router::connect(
    '/privacy', 
    array('controller' => 'pages', 'action' => 'display', 'privacy')
);
Router::connect(
    '/about', 
    array('controller' => 'pages', 'action' => 'display', 'about')
);

使用常规mod_rewrite,您可以执行以下操作:

/(terms|privacy|about) /pages/display/$1

所以我自然而然地尝试了这个:

Router::connect(
    '/(terms|privacy|about)', 
    array('controller' => 'pages', 'action' => 'display', '$1')
);

它不起作用。是否支持这样的事情,如果是这样的话你怎么做?

1 个答案:

答案 0 :(得分:3)

就在我的脑海中,这可能会解决问题。要对您需要执行此操作的部分执行正则表达式匹配,请执行以下操作:

Router::connect(
    '/:page',
    array(
        'controller' => 'pages',
        'action' => 'display',
    ),
    array(
        'page' => '(terms|privacy|about)',
        'pass' => array('page')
    )
);

注意如何在第三个参数(数组)中推断URL中的page占位符。在那里我们说它必须匹配提供的正则表达式。另外值得注意的是,它还表示将page占位符传递给action方法。这样它就知道要渲染哪个页面。