【问题标题】:CakePHP 2.0 Disable Routing IssueCakePHP 2.0 禁用路由问题
【发布时间】:2012-06-23 16:16:25
【问题描述】:

我在 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

【问题讨论】:

  • 如果您在理解路由系统时遇到问题,我建议您保留默认路由。 /controller/method/arg1/arg2/... 你有什么理由重做路由吗?
  • 是的,我已经重做路由,因为我想要诸如 mywebsite/blog/2005/05/this-is-the-title 之类的东西,它应该映射到帖子控制器的方法视图和传递两个参数.. 无论如何,重新定义它并因此限制可能的 url 访问是有意义的。我已经了解如何定义新路由并且一切正常,但我真的不明白为什么传递给 requestAction 的数组仍然需要进行路由?
  • 我想禁用默认路由以规避 SEO 问题,正如食谱中所建议的那样。
  • 这可能是你的问题,as the cookbook warns。您可以将您的路由配置粘贴到您的问题中吗?这与您的问题有关。
  • 另外,一般建议,让它工作,让它漂亮,让它快速(/优化)。过早的优化可能会导致不必要的麻烦。

标签: php cakephp cakephp-2.0


【解决方案1】:

好的,在与 IRC 的开发人员进行广泛讨论后,我想我已经足够了解这一点,可以向您解释:

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

注意:下面的 cmets 来自此答案的早期版本。

【讨论】:

  • 感谢您的回答。但这不会改变任何事情。问题是,整个参数的东西甚至不适用于我,我没有将任何东西传递给函数。 Essential是以下段落,这让我首先提出了这个问题:“这允许requestAction调用绕过Router::url的使用,从而提高性能。”。所以根据这个,应该绕过路由器,即使我没有定义路由规则,它也应该工作?!
  • 啊,我明白了。我不确定我从哪里得到你试图传递参数的想法。你是对的,提供了一个应该绕过路由器的 URL。我会做一些研究。
  • 好的,谢谢..路由系统我还没有真正掌握,书上也不是那么容易描述..
  • 您是否尝试过(仅出于测试目的)将 Route 添加到控制器的操作中,然后使用该路由执行 requestAction?这将告诉我们问题出在 Action 还是 Route。比如:echo $this->requestAction('/articles/view/5');
  • 是的,我已经添加了路由Router::connect('/assets/displayHomeAbstract', array( 'controller' => 'assets', 'action' => 'displayHomeAbstract' ));,现在没有更多错误,如果我添加$this->requestAction('/assets/displayHomeAbstract/'),它也可以正常工作。但是这样做,它只是告诉我将路由添加到 routes.php 解决了问题 - 实际上我不明白的事情,因为路由应该被绕过。
【解决方案2】:

解决问题的关键是了解 Cake 路由的范围及其工作原理。

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

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

【讨论】:

  • 谢谢你的回答,是按照@swiecki 的那一个!
  • 很高兴我能帮上忙。当你让它工作时,我会花一点时间考虑你的设计。拥有一个唯一的工作就是构建这些元素的私有控制器听起来很奇怪,一个简单的$controller->set() 在组件中可能就足够了。
  • 您指的是哪个控制器?我将 Assets 作为控制器,因为我有一个数据库表“assets”,我在其中保存所有内容,例如静态内容(实际上不是静态的,因为我可能会不时更改它)。例如,整个网站的摘要,或者我的关于描述。我用 Elements 得到了这些东西。你会如何在这里引入一个组件?
  • A Component 是控制器之间共享的逻辑。您可以将组件写入loadModel('Asset'),然后写入set('data_for_element'),然后将其简单地包含在您想要显示资产表中数据的任何控制器中。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 2012-06-27
    • 2012-03-03
    • 2012-11-28
    • 2016-04-07
    • 2016-07-18
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多