2013-02-26 128 views
1

首先,我明白有很多问题和解决方案,但没有找到解决我的问题。CakePHP反向路由:Html链接没有显示正确的链接

综上所述,HTML帮助是无法扭转正确,而非网址的路由是这样的:

http://website.com/user_of_website/slug_name 

我得到的网址是这样的:

http://website.com/things/view/username:user_of_website/slug:a_thing 

这里是我的路由器设置:

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); 
/** 
* ...and connect the rest of 'Pages' controller's urls. 
*/ 
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 

//User routes 
Router::connect('/login', array('controller' => 'users', 'action' => 'login')); 
Router::connect('/logout', array('controller' => 'users', 'action' => 'logout')); 
Router::connect('/register', array('controller' => 'users', 'action' => 'add')); 

Router::connect('/users/:action/*', array('controller' => 'users')); 
Router::connect('/things/:action/*', array('controller' => 'things')); 

Router::connect(
    '/:username/:slug', 
    array(
     'controller' => 'things', 
     'action' => 'view' 
    ),array(
     'username' => '[a-zA-Z0-9_]+', 
     'slug' => '[a-zA-Z0-9_]+', 
     'pass'=>array(
      'username', 
      'slug' 
     ) 
    ) 
); 
Router::connect('/:userName', array('controller' => 'things', 'action' => 'user'),array('pass'=>array('userName'))); 

而我的Html帮手:

echo $this->Html->link('View', array(
    'controller' => 'things', 
    'action' => 'view', 
    'username' => 'user_of_website', 
    'slug' => 'a_thing' 
),array(
    'class' => 'text-warning' 
)); 

我真的不明白我做错了什么。任何帮助不胜感激。

NB,我使用CakePHP 2.3

+0

不知道这会影响你的问题,但最后路线('/:userName')用途一个不同的符号(camelcased)*和*不包含用户名参数 – thaJeztah 2013-02-26 22:35:27

+0

@thaJeztah的定义/正则表达式,是的我正在测试一些东西,但不相关。这个问题是当我测试/用户名/ slu links链接 – ST0N3 2013-02-27 13:27:23

回答

1

您是否尝试过,如果它,如果你禁用things“正规军”路线的作品?例如。 /things/:action/*

我的猜测是,由于通配符的缘故,这条路线也会与网址匹配,而且,因为它定义了之前的您的自定义路线,将会替代匹配。

如果能解决问题,您可以尝试下面移动你的“自定义”路由路线

+0

谢谢你,这是行不通的。然而任何链接到/ things/action被/:username /:slug规则所捕获。我通过添加仅影响该操作的规则来解决此问题,例如/ things/add 这很好,因为只有几个动作。我必须确保我设置了一个健壮的用户名黑名单。再次感谢。 – ST0N3 2013-02-27 13:49:39

+0

很高兴我能帮到你。您也可以修改“用户名”正则表达式,以便排除控制器名称。 OR(可能最好?)将自定义路由*放置在默认的CakePHP路由下面。这样CakePHP路由将在使用您的路由之前匹配 – thaJeztah 2013-02-27 17:34:15