在CakePHP中,如何在不改变HtmlHelper链接(…)调用的情况下重新定义URL生成?

在CakePHP中,如何在不改变HtmlHelper链接(…)调用的情况下重新定义URL生成?,cakephp,routing,url-routing,html-helper,cakephp-routing,Cakephp,Routing,Url Routing,Html Helper,Cakephp Routing,我有一个CakePHP网站,有许多内部链接,它们是用HtmlHelper构建的: /app/View/MyController/myaction.ctp <?php echo $this->Html->link( $item['Search']['name'], array( 'controller' => 'targetcontroller', 'action' => 'targetaction',

我有一个CakePHP网站,有许多内部链接,它们是用
HtmlHelper
构建的:

/app/View/MyController/myaction.ctp

<?php
echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        $profileId,
        $languageId
    )
);
?>
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
Router::connect(
    '/:iso6391/:name.html',
    array('controller' => 'mycontroller', 'action' => 'myaction'),
    array(
        'iso6391' => '[a-zA-Z]+',
        'name' => '[0-9a-zA-ZäöüßÄÖÜ\-]+',
    )
);
生成的链接如下所示:
/mycontroller/myaction/$profileId/$languageId

现在,我想为网站的一部分使用搜索引擎友好的URL(配置文件名称和ISO-639-1语言代码,而不是ID),并添加了一个新的路由:

/app/Config/routes.php

<?php
echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        $profileId,
        $languageId
    )
);
?>
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
Router::connect(
    '/:iso6391/:name.html',
    array('controller' => 'mycontroller', 'action' => 'myaction'),
    array(
        'iso6391' => '[a-zA-Z]+',
        'name' => '[0-9a-zA-ZäöüßÄÖÜ\-]+',
    )
);
而且它也工作得很好,像
/producer/en/TestName.html
这样的输入URI被正确解释

但是
HtmlHelper
仍在生成旧的URI,如
/mycontroller/myaction/1/1

报告说:

反向路由是CakePHP中的一项功能,它允许您轻松更改URL结构,而无需修改所有代码。通过使用路由数组定义URL,您可以稍后配置路由,生成的URL将自动更新

嗯,
HtmlHelper
获取一个路由数组作为输入,这意味着:我正在使用反向路由


为什么它不起作用?如何让
HtmlHelper
生成新的URL(而不更改
HtmlHelper链接(…)
调用)?

首先解释一下

从技术上讲,您没有使用反向路由。你看,输出链接,
/mycontroller/myaction/1/1
显然与
/iso/name.html
不匹配。绝对不会。因此,路由跳过该规则,因为它不适用

代码

试试这个

echo $this->Html->link(
    $item['Search']['name'],
    array(
        'controller' => 'targetcontroller',
        'action' => 'targetaction',
        'iso6391' => $someStringWithIso,
        'name' => $someName
    )
);
但为此,您必须稍微更改路由,因为您没有传递参数(查看示例)

您必须注意第一个字符串匹配
/:iso6391/:name.html
。是否要将此路由与项目中的每个控制器和操作相匹配,或者仅与一个控制器和一个视图相匹配。如果它适用于所有项目,只是为了预防,请使用它

  /:controller/:action/:iso6391/:name.html
如果仅用于控制器1和动作“视图”,请使用

你需要考虑的细节是你使用的扩展<代码> .html <代码>,在URL中真的有必要吗?如果是,则将其作为参数添加到Html#链接中

并将
parseExtensions
添加到路由文件中。如果不添加扩展,会更容易,但这取决于您


最后,您仍然需要将呼叫更改为
Html->link

谢谢您的回答,但是,正如您正确地说的,使用此解决方案“最后,我仍然需要将呼叫更改为Html->link”。再次感谢您,但这并不是解决此问题的真正方法。@automatix无法以某种方式修改
HtmlHelper::link()
调用,可以直接为反向路由传递正确的值,也可以使用自定义帮助器转换传递的选项,或者其他任何方式。。。