CakePHP 反向路由:Html 链接未显示正确的链接

Posted

技术标签:

【中文标题】CakePHP 反向路由:Html 链接未显示正确的链接【英文标题】:CakePHP reverse routing: Html link not showing correct link 【发布时间】:2013-02-12 14:01:02 【问题描述】:

首先,我知道有很多关于此的问题和解决方案,但我没有找到解决我的问题。

总而言之,html 助手没有正确地反向路由,而是像这样的 URL:

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

我真的看不出我做错了什么。非常感谢任何帮助。

注意,我使用的是 Cakephp 2.3

【问题讨论】:

不知道这是否会影响您的问题,但最后一条路线 (/:userName) 使用不同的表示法(驼峰式)并且不包含定义/正则表达式用户名参数 @thaJeztah,是的,我正在测试一些东西,但不相关。问题出在我测试 /username/slug 链接时 【参考方案1】:

您是否尝试过禁用things 的“常规”路由是否有效?例如。 /things/:action/*

我的猜测是,由于通配符的原因,该路由也将匹配 URL,并且由于它是在您的自定义路由之前定义的,因此将被匹配。

如果这样可以解决问题,您可以尝试将该路线移到您的“自定义”路线

【讨论】:

谢谢,确实有效。然而,任何指向 /things/action 的链接都被 /:username/:slug 规则捕获。我通过在其上方添加仅影响该操作的规则来解决此问题,例如/things/add 这很好,因为只有几个动作。我必须确保我设置了一个强大的用户名黑名单。再次感谢。 很高兴我能帮上忙。您还可以修改“用户名”正则表达式,以便排除控制器名称。或者(可能是最好的?)将自定义路由低于默认的 CakePHP 路由。这样,CakePHP 路由将在使用您的路由之前匹配

以上是关于CakePHP 反向路由:Html 链接未显示正确的链接的主要内容,如果未能解决你的问题,请参考以下文章

默认路由(控制器/动作)和 css/js 的链接不起作用 cakephp

CakePHP - 如何使用 slug 进行反向路由?

CakePHP 中的反向路由基于 Slug 的 URL

webroot中的CakePHP图像未在生产中显示

CakePHP:表单输入(呈现为选择)未正确处理 hasOne 关系

CakePHP 1.3 未保存到数据库但 sql 语句正确且 insertID 正确增加