CakePHP创建仅在所有其他路由失败时使用的路由

时间:2012-07-12 23:11:41

标签: cakephp routes custom-routes

我正在使用PagesController(与Cake内置的不一样),我想连接一条新路线:

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类完成,但我不知道具体如何。

2 个答案:

答案 0 :(得分: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';

希望这会有所帮助

EDITED: 我有一个原则相同的网站..我用这条路线

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

在最后(CakePlugin::routes()之前)并且它对我来说很好。

答案 1 :(得分:1)

我知道这是一篇很老的帖子,但是对于那些在Cake中使用全能路由的人来说,这里是瘦的:

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

现在,为了确保Cake继续“正常”运行 - 意味着诸如/ posts / view / 4之类的URL将路由到PostsController :: view($ id = 4) - 您实际上需要明确定义它位于路径文件中,在/ *定义之前。是的,如果你在Cake中使用catch-all路由,你需要在它之前显式定义每个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'));

一般来说,每个Controller只需要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';