CakePHP 在路由中使用正则表达式变量捕获?

标签 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')
);

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

最佳答案

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

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

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

关于CakePHP 在路由中使用正则表达式变量捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4973389/

相关文章:

php - 使用 knockout.js 和 CakePHP 的 GET 请求失败

mysql - 在 CakePHP 2.5.1 中将数据从一个表单保存到多个表中

regex - mod_rewrite 可以做数学吗?

用于动态 URL 的 Apache Mod_Rewrite Htaccess

c# - 将 MVC View 路由值映射到物理路径

angularjs - 从 ngRoute/$routeProvider 迁移到 ui-router/$urlRouterProvider

javascript - 使用 AngularJS 选择多个显示名称而不是 ID

php - PHP 应用程序中缺少数据库连接错误

ruby-on-rails - 我可以在 Controller 中设置默认命名空间路由吗

model-view-controller - 简单的 MVC 模式重写