1

我有一个带有许多内部链接的 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äöüßÄÖÜ\-]+',
    )
);

而且它也可以正常工作,并且可以正确解释传入的 URI /producer/en/TestName.html

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

文档说:

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

好吧,HtmlHelper得到一个路由数组作为输入,这意味着:我正在使用反向路由。

为什么它不起作用?如何HtmlHelper生成新的 URL(不更改HtmlHelper#link(...)调用)?

4

1 回答 1

1

先解释一下

从技术上讲,您没有使用反向路由。你看,输出链接,/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 和动作“视图”,使用

  /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...

于 2014-06-27T13:32:59.627 回答