如何在CakePHP中的HtmlHelper#link(...)调用中重新定义URL生成而不进行更改?

时间:2014-06-27 11:32:40

标签: 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',
        $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(...)次来电)?

1 个答案:

答案 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 ...