【问题标题】:What's the correct way to use Cakephp urls?使用 Cakephp 网址的正确方法是什么?
【发布时间】:2010-06-13 03:19:17
【问题描述】:

这是我在这里的第一篇文章:)

我在处理 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 具有嵌入在操作中的前缀(即 [action] => 'admin_edit'),而 Router::parse() 的结果没有。两者当然都有自己的键中的前缀。

总而言之,我如何以正确的方式在提到的这 3 种(或 4 种,如果包含前缀的东西)格式之间转换 url? 当然,破解我的方式很容易,但我仍然愿意相信蛋糕是由一群比我有更多经验和洞察力的人开发的,所以我猜有一个很好的这种“感知到的不当行为”的原因。

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

【问题讨论】:

    标签: url cakephp router cakephp-1.3


    【解决方案1】:

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

    您应该根据要调用的控制器操作来考虑它。 URL(作为字符串)只是在网络环境中完成此任务的必要手段。您应该不需要使用 Dispatcher 格式。指定 URL 时也不应使用字符串表示法,因为如果您想更改 URL 方案,这些将无法反向路由。

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

    【讨论】:

    • 感谢您的快速回答。我问这个是因为我所知道的不是一个单一的 Cake 函数返回 this(array) 格式。由于缺乏一个真实的例子,让我们使用 $controller->referer()。 referer() 的结果是字符串,我需要将其转换为数组才能对其进行修改。我知道的唯一方法是 Router::parse(),它返回调度程序参数。如果我想将结果与数组 URL 进行比较,我还必须将数组 URL 转换为调度程序参数,这是通过 Router::parse(Router::normalize(Router::url($arrayUrl))) 完成的。不好。
    • @Pichan 引荐来源网址是一个有趣的案例,因为它既是您可能想要解析的东西,同时又是您一开始不应该过多关注的东西。由于您似乎确实缺乏示例,因此我的建议是有效的。 :)
    • 假设我需要将当前 URL 保存到会话中,因此当某项任务完成后,访问者将被带回该任务所在的页面。到目前为止,我一直在使用 $this->params,它与数组 URL 不同,因此只需稍加修改即可使它们运行良好。我只是想避免必须以某种格式对控制器已经可用的 URL 进行硬编码。我开始认为 Cake 不会和我一起做这个,但它只是 Cake 还是我的想法有缺陷?毕竟我对整个 MVC 的事情很陌生,所以这不会是一个惊喜 :)
    • 这些评论框太小了。为了让我上面的简单示例更多地反映现实世界,假设有时需要更改 url 部分,例如如果 URL 是字符串则很难管理的控制器或操作。我不太确定数组 URL 和调度程序参数在不同路由下的行为是否相同,但如果它们是不同格式的相同数据,我总是可以编写自己的转换函数。我有一种感觉,虽然它不会像我希望的那样发展:) 如果你对此有一些见解,请分享你的智慧:)
    • @Pichan 我仍然认为你永远不会真正需要这个功能,应该总是有另一种方法来做到这一点。在保存 URL 以返回访问者的情况下,您只需将它们保存为字符串就可以了。我认为保存那个 URL,但是改变它的一部分是一个相当人为的例子。在这种情况下,您宁愿只保存您感兴趣的部分,例如$this->params['action'],然后以标准数组格式拼凑一个新的 URL。我认为如果真的需要来回转换格式,那么现在有人会添加该功能。 :)
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2021-11-24
    • 2021-09-23
    • 2017-04-07
    • 2013-01-09
    • 2013-03-19
    相关资源
    最近更新 更多