我有一个CakePHP网站与许多内部链接,这是建立与HtmlHelper
:
/app/视图/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
仍然生成旧的uri,如/mycontroller/myaction/1/1
。
文档说:
反向路由是CakePHP中的一个特性,它允许您轻松更改URL结构,而无需修改所有代码。通过使用路由数组来定义你的url,你以后可以配置路由,生成的url会自动更新。
好吧,HtmlHelper
得到一个路由数组作为输入,这意味着:我使用反向路由。
为什么不工作?如何使HtmlHelper
生成新的url(不改变HtmlHelper#link(...)
调用)?
先解释一下
你是技术上没有使用反向路由。你看,输出链接,/mycontroller/myaction/1/1
肯定不匹配/iso/name.html
。不可能。因此,路由会跳过该规则,因为它不适用。
试试这个
echo $this->Html->link(
$item['Search']['name'],
array(
'controller' => 'targetcontroller',
'action' => 'targetaction',
'iso6391' => $someStringWithIso,
'name' => $someName
)
);
但是,你必须改变你的路由一点,因为你没有传递参数(检查文档的例子)
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
如果仅用于Controller1和动作"view",则使用
/controller1/view/:iso6391/:name.html
你需要考虑的细节是你使用.html
的扩展,在url中真的有必要吗?如果是,将其作为参数添加到Html#link
echo $this->Html->link(
$item['Search']['name'],
array(
'controller' => 'targetcontroller',
'action' => 'targetaction',
'iso6391' => $someStringWithIso,
'name' => $someName
'ext' => 'html'
)
);
,并将parseExtensions
添加到路由文件中。读这篇文章。如果你不添加扩展名会更容易,但这取决于你。
最后,您仍然需要将调用更改为Html->link
…