如何让 CakePHP 2 在使用 HTML Helper 时将 'index' 保留在 URL 中

How to get CakePHP 2 to keep 'index' in URL when using HTML Helper

在 CakePHP 2.x 中有一个 HTML Helper 允许在视图中创建超链接。

如果我用这个...

<?php
    echo $this->Html->link('Navigation', 
    array('controller' => 'navigations', 'action' => 'foo')
    );
?>

... 它将生成一个 URL 到 /navigations/foo (NavigationsController::foo).

但是如果我使用 index 作为 action

<?php
    echo $this->Html->link('Navigation', 
    array('controller' => 'navigations', 'action' => 'index')
    );
?>

URL 变为 /navigations

我了解 "index" 是网页的默认设置。但是,我实际上需要 URL 为 /navigations/index,或者至少有一个尾部斜杠 (/navigations/)。

这可能吗?

改为修复 AJAX URL

关于您评论中的解释,我认为 "correct" 解决此问题的方法是对 AJAX 调用使用适当的根相对 URLs,因为更改 URL 结构只会掩盖潜在的问题,即针对非唯一资源。

我个人总是使用 Router::url() 来生成 URLs,或者在通过 PHP 提供它们时在特定的脚本文件中生成,或者通过在例如布局中写出配置,它是全局的,以便脚本可以在需要时访问它:

<script>
var config = {
    navigationDataUrl: <?php echo json_encode(
        Router::url(array('controller' => 'Navigations', 'action' => 'get_data'))
    ) ?>
};
</script>

或通过配置可能存在的 JS 对象。

<script>
navigation.dataUrl = <?php echo json_encode(
    Router::url(array('controller' => 'Navigations', 'action' => 'get_data'))
) ?>;
</script>

使用显式索引部分连接路由

也就是说,为了完成,可以通过连接明确定义该部分的路由来强制不删除 index 部分,而不是使用 :action 路由元素,例如:

Router::connect('/:controller/index', array('action' => 'index'));

这将 match/catch URL 数组在被 CakePHP 的默认控制器索引 catchall 路由处理之前像你的数组,看起来像:

Router::connect('/:controller', array('action' => 'index'), array('defaultRoute' => true));

https://github.com/cakephp/cakephp/blob/2.10.6/lib/Cake/Config/routes.php#L72