在CakePHP中,如何在不改变HtmlHelper链接(…)调用的情况下重新定义URL生成?
我有一个CakePHP网站,有许多内部链接,它们是用在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',
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()
调用,可以直接为反向路由传递正确的值,也可以使用自定义帮助器转换传递的选项,或者其他任何方式。。。