2010-06-13 44 views
1

这是我在这里的第一篇文章:)使用Cakephp网址的正确方法是什么?

我在处理网址和参数时遇到了一些困难。我一遍又一遍地浏览路由器类的api文档,发现没有用。

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

主要是我有转换字符串网址到基本数组格式的问题。 比方说,我想$ arrayUrl再次转换为字符串,不是进入网址:

$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] => 
) */ 

这似乎是一个可怕的很多代码做简单的东西,以2种核心格式之间的转换。另外请注意,$ parsed与$ arrayUrl仍然不一样。当然,我可以手动调整$解析,实际上我已经做了几次,作为一个快速修补程序,但我想深究这一点。我也注意到,当使用前缀路由时,控制器中的$ this-> params在动作中嵌入了前缀(即[action] =>'admin_edit'),而Router :: parse()的结果不会。两者当然都有它自己的密钥中的前缀。总结一下,如何在这3个(或4个,如果包含前缀的东西)之间转换一个url,提供的格式是正确的? 当然,这很容易破解我的方式,但我仍然希望相信蛋糕是由一群比我有更多经验和洞察力的人开发的,所以我猜测这里有一个这种“感知不当行为”的充分理由。

我试过尽我所能提出我的问题,但由于我生锈的英语技能,我不得不走几弯路:)如果需要,我会解释更多。

回答

2

Cake URL的“官方”格式应该是数组符号array('controller' => 'foo', 'action' => 'bar', 'baz', 'admin' => true)。每当你写URL时,你都应该使用这种格式。路由器类会将它们转换为字符串(/admin/foo/bar/baz)或分派器所需的信息(array('named' => array(), 'pass' => array(), …)),具体取决于URL的使用位置。

您应该根据您想要调用的控制器动作来考虑它。网址(作为字符串)只是在Web上下文中完成这项工作的必要罪恶。应该没有必要使用Dispatcher格式。在指定URL时,您也不应使用字符串符号,因为如果您想要更改URL方案,则不能反向路由。

也许你可以用一个例子来解释为什么你需要将这三种形式从一种转换为另一种?

+0

感谢您的快速回答。 我问过这个问题,因为我知道的不是一个sigle Cake函数会返回这个(数组)格式。缺乏一个真实的例子,我们使用$ controller-> referer()。 referer()的结果是字符串,我需要将其转换为数组以便对其进行修改。我知道的唯一方法是Router :: parse(),它返回调度器参数。如果我想将结果与数组URL进行比较,那么我还必须将数组URL转换为调度程序参数,这通过Router :: parse(Router :: normalize(Router :: url($ arrayUrl)))完成。不好。 – jpeltoniemi 2010-06-13 12:27:06

+0

@Pichan推荐人是一个有趣的案例,因为它既是你可能想要分析的东西,也是你不应该首先关注的东西。既然你真的缺乏一个例子,我的建议就是这样。 :) – deceze 2010-06-13 23:05:34

+0

假设我需要将当前网址保存到会话中,所以当某个任务完成后,访问者会回到源自任务的页面。到目前为止,我一直在使用$ this-> params,这与array数组不同,所以需要一点点修补才能让它们变得更好。 我只是想避免以某种格式硬编码已经可用于控制器的URL。我开始认为蛋糕不会在这一块上与我一起工作,但它只是蛋糕还是我的思想有缺陷?毕竟,我对整个MVC的东西都很绿,所以它不会是一个惊喜:) – jpeltoniemi 2010-06-14 00:15:46