我知道这是一篇旧帖子,但对于任何在 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';