CakePhp使用Controller通配符路由

时间:2013-12-03 18:54:41

标签: cakephp

我想重新路由所有 domainname.com/affiliateXYZ 访问AffController重新路由操作。但是如何?

'affiliate'的路由元素子字符串将是一致的,子字符串'XYZ'将会变化。

我会首选项目要求允许 domainname.com/aff/reroute/XYX (或 domainname.com/aff/reroute/CigarKing )在控制器/动作/参数格式中,但唉......不是这样。

最初,我尝试了以下尝试失败:

Router::connect('/affiliate*',     array('controller' => 'aff', 'action' => 'reroute'));
Router::connect('/affiliate**',     array('controller' => 'aff', 'action' => 'reroute'));
Router::connect('/:controller*',     array('controller' => 'aff', 'action' => 'reroute'), array('controller'=>'(affiliate)');

一旦进入控制器重新路由动作,我会将affiliateXYZ爆炸成'XYZ',然后继续我知道如何做的事情。我的问题是将affiliateXYZ作为第一个路由元素路由到控制器,同时不会弄乱当前的功能。

我使用Router::connect('/:affiliate', array('controller' => 'aff', 'action' => 'reroute'),array('pass'=>array('affiliate')));将信息导入控制器,直到我看到对预先存在的控制器的负面影响(我假设因为我没有明确列出所有其他控制器,我不认为我应该这样做。)。

如何路由w /前缀(更准确地说是'affiliate'的子字符串)?

我知道前缀是错误的术语。

Thx,提前。

1 个答案:

答案 0 :(得分:1)

您正在寻找正则表达式匹配,借助此功能,您可以定义特定路径元素的匹配方式。

此选项适用于Router::connect()的第三个参数 您可以用element => regex格式定义它:

Router::connect(
    '/:affilate',
    array(
        'controller' => 'aff',
        'action' => 'reroute'
    ),
    array(
        'pass' => array('affilate'),
        'affilate' => 'affilate[^/]+'
    )
);

这将匹配以affilate开头的任何网址,后跟一个或多个不是/的字符。

另见http://book.cakephp.org/2.0/en/development/routing.html#route-elements