2013-12-03 118 views
2

我想重新路由所有domainname.com/affiliateXYZ访问AffController重新路由操作。但是如何?CakePhp路由与控制器通配符

'affiliate'的route元素子串将是一致的,子串'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 /前缀(更准确地说'子公司'的子字符串)?

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

Thx,提前。

回答

1

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

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

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

这将匹配以affilate开头的URL,通过1个或多个字符不属于/ followd。

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

+0

Thx ndm。它不仅与你描述的功能完全一样,而且比我基于[http://lecterror.com/articles/view/advanced-routing-with-cakephp-one-example]实现的冗长的选择更简洁正则表达式是我的问题。很高兴能坚持w /路由器:按照您的建议连接使用率,而不是在控制器上循环,然后在lecterror.com上使用负面正则表达式 – user3062784