如何让 CakePHP 2 在使用 HTML 助手时将"索引"保留在 URL 中



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

如果我使用这个...

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

。它将生成一个指向/navigations/foo的URL(NavigationsController::foo)。

但是,如果我使用index作为action

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

网址变为/navigations

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

这可能吗?

改为修复 AJAX URL

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

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

<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部分,而不是使用:actionroute 元素,例如:

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

这将在 CakePHP 的默认控制器索引捕获路由处理之前匹配/捕获像您这样的 URL 数组,如下所示:

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

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

最新更新