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

CakePHP创建仅在所有其他路由失败时使用的路由,cakephp,routes,custom-routes,Cakephp,Routes,Custom Routes,我正在使用PagesController(与Cake内置的不同),我想连接一条新路线: Router::connect('/*', array('controller' => 'pages', 'action' => 'view')); 我真的希望Cake只在所有其他(默认)路由失败时使用此路由。然而,我似乎无法让它只与路线一起工作。我有一种预感,我需要使用一个定制的CakeRoute类,但我完全不知道如何让它完成我想要它做的事情 谁能帮我一下吗 [编辑]知道我使用的是CakePH

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

Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
我真的希望Cake只在所有其他(默认)路由失败时使用此路由。然而,我似乎无法让它只与路线一起工作。我有一种预感,我需要使用一个定制的CakeRoute类,但我完全不知道如何让它完成我想要它做的事情

谁能帮我一下吗

[编辑]知道我使用的是CakePHP 2.2.0可能会很有用

[2次编辑]根据要求,提供更多信息。 我的路由器当前看起来像这样:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
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';
当我转到/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类来完成,但我不知道具体是如何完成的。

尝试将您的常规路线放在末尾,但放在
CakePlugin::routes()之前行。大概是这样的:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
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()
之前),它对我来说很好。

我知道这是一篇老文章,但对于那些在Cake中挣扎于“一网打尽”路由的人来说,这里有一个小问题:

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

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

嗯,只是想看看。。。该路由是routes.php文件中的最后一个路由吗??顺序很重要,我也试过,但从来没有用过。如果另一个路由找不到匹配的控制器/操作,那么它只会给我一个错误页面,而不是尝试我的回退路由。你能发布你的routes.php和一个失败的url示例吗?我已经在开始的帖子中添加了更多信息。我已经尝试过了,但随后所有内容都被路由到我的页面/视图,虽然我只希望无法路由到我的页面/视图的URL,但问题可能在于
*
。。。你试过传递一个变量吗?我用我的一个网站的例子编辑了我的答案,它只适用于只有一个单词的URL。当我使用/home时,它可以工作,但是当我尝试获取子页面时,例如/home/about,它就不再工作了。嗯,可能在我给你的一个页面之后添加
/**
路由,检查这个,然后我会遇到与以前相同的问题,路由用于每个URL,而不仅仅用于无法路由的URL,这是我真正想要的。