我有一个CakePHP网站,其中包含许多内部链接,这些链接是使用HtmlHelper
构建的:
/app/View/MyController/myaction.ctp
<?php
echo $this->Html->link(
$item['Search']['name'],
array(
'controller' => 'targetcontroller',
'action' => 'targetaction',
$profileId,
$languageId
)
);
?>
使用默认路由时可以正常工作:
/app/Config/routes.php
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
生成的链接如下所示:/mycontroller/myaction/$profileId/$languageId
。
现在我想在网站的一部分使用搜索引擎友好的URL(带有配置文件名称和ISO-639-1语言代码而不是ID)并添加了新的路由:
/app/Config/routes.php
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
仍然会生成像/mycontroller/myaction/1/1
这样的旧URI。
docu说:
反向路由是CakePHP中的一项功能,用于轻松更改URL结构,而无需修改所有代码。通过使用路由阵列来定义URL,您可以稍后配置路由,生成的URL将自动更新。
好吧,HtmlHelper
获取路由数组作为输入,这意味着:我使用反向路由。
为什么不起作用?如何让HtmlHelper
生成新网址(不更改HtmlHelper#link(...)
次来电)?
答案 0 :(得分:1)
首先解释一下
您技术上没有使用反向路由。您看,输出链接/mycontroller/myaction/1/1
明确地与/iso/name.html
不匹配。喜欢,绝不。因此,路由会跳过该规则,因为它不适用。
<强>代码强>
试试这个
echo $this->Html->link(
$item['Search']['name'],
array(
'controller' => 'targetcontroller',
'action' => 'targetaction',
'iso6391' => $someStringWithIso,
'name' => $someName
)
);
但为此,您必须稍微更改路由,因为您没有传递参数(请查看the docs示例)
Router::connect(
'/:iso6391/:name.html',
array('controller' => 'mycontroller', 'action' => 'myaction'),
array(
'pass' => array('iso6391', 'name'),
'iso6391' => '[a-zA-Z]+',
'name' => '[0-9a-zA-ZäöüßÄÖÜ\-]+',
)
);
你必须要记住第一个字符串匹配/:iso6391/:name.html
。是否要将此路由与项目中的每个控制器和操作匹配,或者只是一个控制器和一个视图。如果它适用于所有项目,只是为了预防,请使用此
/:controller/:action/:iso6391/:name.html
如果只是为了控制器1和动作“视图”,请使用
/controller1/view/:iso6391/:name.html
您需要考虑的详细信息是您使用的扩展程序.html
,这是否真的需要在网址中?如果是,请将其作为参数添加到Html#link
echo $this->Html->link(
$item['Search']['name'],
array(
'controller' => 'targetcontroller',
'action' => 'targetaction',
'iso6391' => $someStringWithIso,
'name' => $someName
'ext' => 'html'
)
);
并将parseExtensions
添加到路由文件中。 Read this。如果你不添加扩展名会更容易,但这取决于你。
最后,您仍然需要将来电更改为Html->link
...