我正在使用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类完成,但我不知道具体如何。
答案 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';