1

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

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

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

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

[编辑] 哦,知道我使用的是 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 类来完成,但我不知道具体如何。

4

2 回答 2

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()),它对我来说工作正常。

于 2012-07-13T16:00:16.050 回答
1

我知道这是一篇旧帖子,但对于任何在 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';
于 2015-06-04T23:54:41.133 回答