什么';使用Cakephp URL的正确方法是什么?

什么';使用Cakephp URL的正确方法是什么?,url,cakephp,router,cakephp-1.3,Url,Cakephp,Router,Cakephp 1.3,这是我在这里的第一篇帖子:) 我在处理URL和参数方面遇到了一些困难。我一遍又一遍地阅读路由器类api文档,没有发现任何有用的东西 首先,我想知道CakePHP(1.3)中是否有用于处理URL的“通用”格式。我目前将所有url作为简单数组处理(采用Router::url和$html->link接受的格式),只要我只需要将它们作为参数传递给cake自己的方法,就很容易了。如果我需要别的东西,这通常会变得棘手 主要是我在将字符串URL转换为基本数组格式时遇到问题。 假设我想将$arrayUrl转换为

这是我在这里的第一篇帖子:)

我在处理URL和参数方面遇到了一些困难。我一遍又一遍地阅读路由器类api文档,没有发现任何有用的东西

首先,我想知道CakePHP(1.3)中是否有用于处理URL的“通用”格式。我目前将所有url作为简单数组处理(采用Router::url和$html->link接受的格式),只要我只需要将它们作为参数传递给cake自己的方法,就很容易了。如果我需要别的东西,这通常会变得棘手

主要是我在将字符串URL转换为基本数组格式时遇到问题。 假设我想将$arrayUrl转换为字符串,然后再转换为url:

$arrayUrl=array('controller'=>'SomeController','action'=>'someAction','someValue');
$url=Router::url($arrayUrl);       //$url is now '/path/to/site/someController/someAction/someValue'
$url=Router::normalize($url);      //remove '/path/to/site'
$parsed=Router::parse($url);       /*$parsed is now
Array(
    [controller] => someController
    [action] => someAction
    [named] => Array()
    [pass] => Array([0] => someValue)
    [plugin] => 
) */
要在两种核心格式之间进行转换这样简单的事情,似乎需要大量的代码。另外,请注意,$parsed与$arrayUrl的格式仍然不同。当然,我可以手动调整$parsed,事实上,作为一个快速补丁,我已经做了几次了,但我想深入了解一下

我还注意到,当使用前缀路由时,$this->params in controller在操作中嵌入了前缀(即,[action]=>'admin_edit'),而Router::parse()的结果没有。当然,两者都在自己的密钥中有前缀

总而言之,我如何正确地在上述3种(或4种,如果包含前缀的话)格式之间转换url? 当然,我很容易就搞定了,但我仍然相信蛋糕是由一群比我更有经验和洞察力的人开发出来的,所以我猜这种“被感知的不当行为”有很好的理由

我试图尽可能好地表达我的问题,但由于我的英语技能生疏,我不得不走一些弯路:)如果需要,我会解释更多。

蛋糕URL的“官方”格式应该是数组符号
数组('controller'=>'foo','action'=>'bar','baz','admin'=>true)
。无论何时编写URL,都应使用此格式。Router类将这些转换为字符串(
/admin/foo/bar/baz
)或Dispatcher所需的信息(
array('named'=>array(),'pass'=>array(),…)
),具体取决于URL的使用位置

您应该根据要调用的控制器操作来考虑它。URL(作为字符串)只是在web上下文中实现这一点的必要工具。您不需要使用Dispatcher格式。在指定URL时也不应该使用字符串符号,因为如果要更改URL方案,这些URL不能反向路由


也许您可以举例说明为什么需要将这三种形式从一种转换为另一种?

谢谢您的快速回答。我问这个问题是因为我知道没有一个单蛋糕函数返回这种(数组)格式。在缺少真实示例的情况下,让我们使用$controller->referer()。referer()的结果是字符串,我需要将其转换为数组才能修改它。我知道的唯一方法是Router::parse(),它返回调度程序参数。如果要将结果与数组URL进行比较,还必须将数组URL转换为dispatcher参数,这是通过Router::parse(Router::normalize(Router::URL($arrayUrl))完成的。不太好。@Pichan推荐人是一个有趣的例子,因为它既是你可能想要解析的东西,但同时又是你一开始不应该太注意的东西。既然你真的缺乏榜样,我的建议是:假设我需要将当前URL保存到会话,这样当某个任务完成后,访问者将返回到任务发起的页面。到目前为止,我一直在使用$this->params,这与数组URL不同,因此只需稍加修改即可使其发挥作用。我只是想避免以某种格式对控制器已经可用的URL进行硬编码。我开始认为蛋糕在这件事上对我不起作用,但这只是蛋糕还是我的想法有缺陷?毕竟,我对MVC这件事还不太了解,所以这并不奇怪:)该死,这些评论框太小了。为了让我上面的简单示例更真实地反映现实世界,假设有时需要更改url部分,例如控制器或操作,如果url是字符串,则很难管理这些部分。我不确定数组URL和dispatcher参数是否在不同的路由中起相同的作用,但如果它们是不同格式的相同数据,我总是可以编写自己的转换函数。我觉得它不会像我希望的那样发展:)如果你对此有一些见解,请分享你的智慧:)@Pichan我仍然认为你永远不会真正需要这个功能,应该有其他的方法来实现它。在保存URL以返回访问者时,只需将其保存为字符串即可。我认为保存那个URL,然后改变它的一部分是一个相当做作的例子。在这种情况下,您只需保存感兴趣的部分,如
$this->params['action']
,然后以标准数组格式拼凑出一个新的URL。我认为,如果真的需要来回转换格式,现在就应该有人添加该功能了。:)