如何在CakePHP的HtmlHelper#link(..)调用中重新定义生成的url



我有一个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

相关内容

  • 没有找到相关文章

最新更新