【问题标题】:CakePHP use Regex variable capture in routes?CakePHP 在路由中使用正则表达式变量捕获?
【发布时间】:2011-06-25 19:04:52
【问题描述】:

在我的 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')
);

它不起作用。有没有支持这样的东西,如果有,你是怎么做的?

【问题讨论】:

    标签: cakephp mod-rewrite routes cakephp-1.3


    【解决方案1】:

    就在我的脑海中,这可能会解决问题。要对某个部分执行正则表达式匹配,您需要这样做:

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

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

    【讨论】:

    • 我试图了解这里发生了什么。第一个参数/:page冒号是什么意思?
    • 基本上冒号是一个占位符。如果名称是“控制器”或“动作”,Cake 将知道如何映射它。但是在这种情况下,我们使用自己的自定义名称page,然后在方法中我们说“页面必须匹配此正则表达式才能有效”,如果它无效,则路由不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2012-04-30
    • 2015-04-29
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多