如何让 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
在 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