【问题标题】:CakePHP create route used only if all other routes failCakePHP 创建路由仅在所有其他路由都失败时使用
【发布时间】:2012-07-12 23:11:41
【问题描述】:

我正在使用 PagesController(与 Ca​​ke 内置的不同),我想连接一个新路由:

Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

我真的希望 Cake 仅在所有其他(默认)路由都失败时才使用此路由。但是,我似乎无法让它与路线一起工作。我有一种预感,我需要使用自定义 CakeRoute 类,但我完全不知道如何让它做我想做的事情。

有人可以帮我解决这个问题吗?

[edit] 哦,知道我使用的是 CakePHP 2.2.0 可能会很有用

[第二次编辑] 应要求提供更多信息。 我的路由器目前看起来像这样:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

当我转到 /home/about 时,我得到“错误:找不到 HomeController”。 我也试过这个:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
require CAKE . 'Config' . DS . 'routes.php';

但随后一切都被路由到我的页面控制器,我不希望这样。我只希望在所有其他路由都失败时使用该路由。

再次,我有一种预感,这只能通过自定义 CakeRoute 类来完成,但我不知道具体如何。

【问题讨论】:

  • hmmm 只是为了检查...该路由是 routes.php 文件中的最后一条路由吗?顺序很重要
  • 是的,我也尝试过,但它根本没有被使用过。如果另一个路由找不到匹配的控制器/动作,那么它只会给我一个错误页面,而不是尝试我的后备路由。
  • 您能否发布您的 routes.php 和失败的 url 示例?
  • 我在开始的帖子中添加了更多信息。

标签: cakephp routes custom-routes


【解决方案1】:

尝试将您的一般路线放在最后,但在 CakePlugin::routes(); 行之前。像这样的:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
//all your routes
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';

希望对你有帮助

编辑: 我有一个原理相同的网站..我使用了这条路线

Router::connect('/:slug', array('controller' => 'users', 'action' => 'view'),array('pass'=>array('slug'),'slug'=>"[a-z0-9\-]+"));

最后(CakePlugin::routes() 之前),它对我来说工作正常。

【讨论】:

  • 我已经尝试过了,但随后所有内容都被路由到我的页面/视图,而我只希望无法路由的 URL 路由到我的页面/视图
  • 也许问题出在*... 你试过传递变量吗?我用我的一个网站的例子编辑了我的答案
  • 对我来说,这只适用于只有一个单词的 URL。当我执行 /home 时它可以工作,但是当我尝试获取子页面时,例如 /home/about 然后它就不再工作了。
  • hmm 也许在我给你的那条之后添加/** 路线,检查一下book.cakephp.org/2.0/en/development/…
  • 然后我遇到了和以前一样的问题,该路由用于每个 URL,而不是仅用于无法路由的 URL,这是我真正想要的。
【解决方案2】:

我知道这是一篇旧帖子,但对于任何在 Cake 中挣扎于包罗万象的路由的人来说,这里是瘦的:

当您创建诸如 /* 之类的包罗万象的路由时,您就允许该定义抓取 URL 中的任何内容。换句话说,它非常贪婪。据我所知,没有办法有条件地启用这种定义。这意味着如果在定义 /* 之前 URL 不匹配任何路由定义,那么 /* 定义将选择它。所以总是最后定义包罗万象的路线,我们当然已经知道了:-)

现在,为了确保 Cake 继续“正常”运行——这意味着像 /posts/view/4 这样的 URL 将路由到 PostsController::view($id = 4)——你实际上需要显式定义它在路由文件中,在 /* 定义之前。是的,如果您在 Cake 中使用包罗万象的路由,则需要在其前面显式定义每个 Controller::method() 路由以利用标准的 Cake 路由约定。

虽然这听起来可能令人生畏,但如果您在 routes.php 中按字母顺序排列所有路由定义,这还不错。只需查看项目的 /Controller 目录并以相同的顺序列出它们。我还在每个控制器分组上方实现了一个注释,因为有些控制器需要多个路由定义。这是从我的一个 routes.php 文件中提取的示例:

/**
 * CaseStudiesController
 */
Router::connect('/case-studies', array('controller' => 'case_studies', 'action' => 'index'));
Router::connect('/case-studies/:action', array('controller' => 'case_studies'));
Router::connect('/case-studies/:action/*', array('controller' => 'case_studies'));
Router::connect('/case-studies/*', array('controller' => 'case_studies', 'action' => 'index'));

/**
 * PostsController
 */
Router::connect('/posts', array('controller' => 'posts', 'action' => 'index'));
Router::connect('/posts/:action', array('controller' => 'posts'));
Router::connect('/posts/:action/*', array('controller' => 'posts'));
Router::connect('/posts/*', array('controller' => 'posts', 'action' => 'index'));

一般来说,每个控制器只需要 4 个路由定义。最后,在我的例子中,这是 routes.php 的底端:

/**
 * UrlAliasesController
 *
 * This catch-all route is very greedy and even grabs the default CakePHP /:controller/:action URL format
 * Above this line, all public controller methods must be accounted for in specific routes
 */
Router::connect('/*', array('controller' => 'url_aliases', 'action' => 'check', 'admin' => false));

/**
 * Load all plugin routes. See the CakePlugin documentation on
 * how to customize the loading of plugin routes.
 */
CakePlugin::routes();

/**
 * Load the CakePHP default routes. Only remove this if you do not want to use
 * the built-in default routes.
 */
require CAKE . 'Config' . DS . 'routes.php';

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2020-02-03
    • 2018-02-14
    • 2011-08-03
    相关资源
    最近更新 更多