1

我在 routes.php 中有自己的路由规则,为应该通过 URL 访问的所有页面定义,例如 mywebsite/blog/ 和 mywebsite/blog/category/category-name,即我的整个网站的结构由我的自定义路线。

现在,我有很多使用 requestAction 的元素,例如

       $websiteabstract = $this -> requestAction(array(
        'controller' => 'assets',
        'action' => 'displayHomeAbstract'
       ));

这给了我一个错误错误:找不到控制器,可能是因为我没有为 /assets/displayHomeAbstract 定义路由。但是,当我明确声明控制器的名称和操作时,为什么我必须为此定义自定义路由?那不应该完全绕过路由吗?要么我根本不了解路由。还是我真的必须在我的 routes.php 中定义所有可能的路由(甚至是那些仅由 requestAction 使用的路由)?我的意思是,我不想让用户直接访问 mywebsite/assets/displayHomeAbstract,只能通过一个元素。

谢谢

编辑:这是我的 routes.php http://pastebin.com/aAKBwNZJ 请看一下第 128 行,这正是我不想要的,因为 /assets/displayHomeAbstract 只能通过 requestAction 访问。

编辑:这是发出请求的元素:http: //pastebin.com/0tK5dYJk

4

3 回答 3

2

好的,在与 IRC 中的开发人员进行广泛讨论之后,我想我理解这一点足以向您解释:

在这种情况下,您必须为您的 requestAction 定义自定义路由requestAction 正在模拟一个完整的请求。它分派一个请求,就好像每次都使用字符串 url 访问一样,即使提供的 url 是一个数组。这本书是指当您除了使用默认路由(routes.php 的最后一行)之外定义了自定义路由时,您可以使用数组 url 来与这些路由无关。但是,这些数组 url 依赖于 /lib/ 文件夹中的默认 routes.php,用于构造 url 字符串。如果您要使用自定义路由模式,则必须自己构建 url 字符串。

注意:以下评论来自此答案的早期版本。

于 2012-06-23T16:35:17.083 回答
1

解决问题的关键是了解 Cake 路由的范围以及它是如何工作的。

在 CakePHP 中定义路由时,它不仅仅用于将 URL 映射到控制器。路由器还使用它来生成链接地址,在您的情况下,将提供给requestAction()的路径映射到控制器。在幕后,Cake 正在根据您的参数创建一个 URL 字符串,然后将其传递给路由器以找到正确的控制器。由于不存在这样的路线,因此它失败了。

作为一种解决方案,我实际上建议不要为该逻辑使用控制器。根据它的作用,组件或助手可能是一个更好的地方。

于 2012-06-23T17:25:24.137 回答
0

查看第 156 行。您注释掉了加载 CakePHP 的默认路由的行。

于 2012-06-23T17:38:33.507 回答